2017-06-29 129 views
1

我運行下面的腳本,wtf.sql,在SQLite的版本3.16.0:SQLite的外鍵DELETE CASCADE不工作

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 
; 

鍵入以下內容的bash:

$ sqlite3 bits-n-books.db < wtf.sql 

返回以下元組:

90210|Beverly Hills|CA 

我需要怎麼做才能正常刪除級聯?

回答

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'; 

現在該怎麼辦?所有其他地址是否也被刪除了?90210

當父行被刪除時,ON DELETE CASCADE action刪除所有子行。在這種情況下,這意味着從ZIP刪除一行將刪除所有對應的ADDRESS行。在另一方面沒有類似的機制。