Sqlite
如何防止具有特定屬性的行在級聯中被刪除?
我有下表
CREATE TABLE IF NOT EXISTS node ( id INTEGER PRIMARY KEY, name TEXT NOT NULL, type TEXT CHECK(type IN ("DIRECTORY", "EXECUTABLE", "DOCUMENT")) NOT NULL, siblingOrder INTEGER NOT NULL, parentId INTEGER, protected INTEGER NOT NULL, UNIQUE (parentId, siblingOrder) ON CONFLICT ABORT, FOREIGN KEY(parentId) REFERENCES node(id), CONSTRAINT fk_parent FOREIGN KEY (parentId) REFERENCES node(id) ON DELETE CASCADE );
我插入以下數據
INSERT INTO node (id, name, type, siblingOrder, parentId, protected) VALUES (1, "DESKTOP", "DIRECTORY", 0, null, 1), (2, "sys", "DIRECTORY", 1, 1, 0), (3, "dont delete me", "DIRECTORY", 2, 2, 1);
我執行以下命令
DELETE FROM node WHERE id=2;
如何防止刪除
protected
值為 的記錄TRUE
?(在這種情況下,我不希望刪除“不要刪除我”記錄。
Foreign Key 操作是all or nothing,因此無法通過定義外鍵約束的方式來實現您正在尋找的東西。
相反,您可以將
ON DELETE
操作更改為NO ACTION
永遠不會級聯刪除,並且您可以定義一個DELETE
觸發器來檢查記錄是否存在protected
並在不存在DELETE
時執行。