SQLite Forum

DROP TABLE failure - is it intentional or a bug?
Login
Dear all,

assume the following schema:

CREATE TABLE IF NOT EXISTS "type" (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL CHECK (name <> '') UNIQUE COLLATE NOCASE, created DATETIME DEFAULT CURRENT_TIMESTAMP, modified DATETIME AS (datetime(julianday())) STORED);
CREATE TABLE IF NOT EXISTS "quantity" (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, unit TEXT NOT NULL, sumsqr BOOLEAN NULL DEFAULT NULL, logarithmical BOOLEAN NOT NULL, created DATETIME DEFAULT CURRENT_TIMESTAMP, modified DATETIME AS (datetime(julianday())) STORED, UNIQUE (name, unit, sumsqr, logarithmical) ON CONFLICT IGNORE);
CREATE TABLE IF NOT EXISTS "dataset" (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NULL DEFAULT NULL COLLATE NOCASE, parentid INTEGER NULL DEFAULT NULL REFERENCES dataset(id) ON UPDATE CASCADE ON DELETE SET NULL CHECK (parentid <> id), created DATETIME DEFAULT CURRENT_TIMESTAMP, modified DATETIME AS (datetime(julianday())) STORED);
CREATE TABLE IF NOT EXISTS "trace" (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NULL DEFAULT NULL COLLATE NOCASE, typeid INTEGER NULL DEFAULT NULL REFERENCES "type"(id) ON UPDATE CASCADE ON DELETE SET NULL, setupname TEXT COLLATE NOCASE NULL DEFAULT NULL CHECK (setupname <> ''), setuptype TEXT COLLATE NOCASE NULL DEFAULT NULL CHECK (setuptype <> ''), datasetid INTEGER NOT NULL REFERENCES dataset(id) ON UPDATE CASCADE ON DELETE CASCADE, quantityid INTEGER NOT NULL REFERENCES quantity(id) ON UPDATE CASCADE ON DELETE RESTRICT, stored DATETIME NULL DEFAULT NULL, created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, modified DATETIME AS (datetime(julianday())) STORED);
CREATE TABLE IF NOT EXISTS "item" (id INTEGER PRIMARY KEY AUTOINCREMENT, traceid INTEGER NOT NULL REFERENCES trace(id) ON UPDATE CASCADE ON DELETE CASCADE, freq BIGINT NOT NULL CHECK (freq >= 0), value REAL NOT NULL, noiseflag BOOLEAN NULL DEFAULT NULL, nameid INTEGER NULL REFERENCES meta2(id) ON UPDATE CASCADE ON DELETE SET NULL);
CREATE TABLE IF NOT EXISTS meta2 (id INTEGER PRIMARY KEY AUTOINCREMENT, parameter TEXT NOT NULL COLLATE NOCASE, value TEXT NOT NULL COLLATE NOCASE, UNIQUE (parameter, value) ON CONFLICT IGNORE);

Now try to delete these tables in the wrong order, e.g.:

DROP TABLE IF EXISTS "type"; -- statement A
DROP TABLE IF EXISTS dataset; -- statement B

Result:

Error: no such table: main.type

The problem is clear, the (already deleted) table "type" is still referenced by other tables. But imho, statement A should fail, not B.