Sqlite

如何防止具有特定屬性的行在級聯中被刪除?

  • December 3, 2021

我有下表

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時執行。

引用自:https://dba.stackexchange.com/questions/303438