问题
I'm running the following script, wtf.sql
, on SQLite Version 3.16.0:
PRAGMA foreign_keys = ON;
CREATE TABLE 'ZIP'(
'Zip' INTEGER PRIMARY KEY NOT NULL,
'City' TEXT NOT NULL,
'State' TEXT NOT NULL
);
CREATE TABLE 'ADDRESS'(
'Address_id' INTEGER PRIMARY KEY AUTOINCREMENT,
'Line_1' TEXT NOT NULL,
'Line_2' TEXT,
'Zip' INTEGER NOT NULL,
FOREIGN KEY('Zip') REFERENCES ZIP('Zip') ON DELETE CASCADE
);
INSERT OR IGNORE INTO ZIP('Zip','City','State')
VALUES ('90210','Beverly Hills','CA')
;
INSERT INTO ADDRESS('Line_1','Line_2','Zip')
VALUES ('1234 Overpriced House Street','c/o Bob','90210')
;
DELETE FROM ADDRESS
WHERE Zip = '90210'
;
SELECT *
FROM ZIP
;
Typing the following into bash:
$ sqlite3 bits-n-books.db < wtf.sql
Returns the following tuple:
90210|Beverly Hills|CA
What do I need to do to have deletes cascade properly?
回答1:
INSERT INTO ADDRESS(Line_1,Line_2,Zip)
VALUES ('1234 Overpriced House Street','c/o Bob','90210'),
('667 Another Street','2nd row','90210');
DELETE FROM ADDRESS WHERE Line_2 = '2nd row';
What should happen now? Should all other addresses referring to 90210
also be deleted?
An ON DELETE CASCADE action deletes any child rows when a parent row is deleted. In this case, this means that deleting a row from ZIP
will delete all corresponding ADDRESS
rows. There is no similar mechanism in the other direction.
来源:https://stackoverflow.com/questions/44821480/sqlite-foreign-key-on-delete-cascade-not-working