Database-Design
SQLite:你可以使用 DELETE 觸發器來刪除同一張表中的其他記錄嗎?
在這種特定情況下,我使用的是 SQLite 數據庫,但我認為這更像是一個具有實際意義的概念性問題。
我的數據庫中有一個嵌套集模型,我想確保當父節點以某種方式從其中刪除時,它的所有子節點也將被刪除。
從 SQLite 的文件中,觸發器允許多個語句,所以我得到了這樣的東西:
CREATE TABLE "tbl_nsm" ( "lft" INTEGER, "rgt" INTEGER ); CREATE TRIGGER IF NOT EXISTS "delete_entire_leaf" AFTER DELETE ON tbl_nsm BEGIN DELETE FROM tbl_nsm WHERE 1=1 AND lft > OLD.lft AND lft < OLD.rgt; UPDATE tbl_nsm SET rgt = rgt - (OLD.rgt - OLD.lft + 1) WHERE rgt > OLD.rgt; UPDATE tbl_nsm SET lft = lft - (OLD.rgt - OLD.lft + 1) WHERE lft > OLD.rgt; END ;
但是,當使用一致的值填充表時,每當我刪除一條記錄時,觸發器似乎什麼都不做:所有其他值都保留下來,甚至沒有一個警告。
AFTER DELETE
我將其改為觸發器,而不是BEFORE DELETE
,但無濟於事。這讓我想到:您可以使用
DELETE
觸發器從表中刪除更多值嗎?或者 SQL 是否簡單地忽略了對此類觸發器的目標表的任何更改?
在 SQLite 中,觸發器可以修改定義它的表。
此觸發器執行的操作不會觸發觸發器。即,如果 ON DELETE 刪除另一行,則此次要刪除將不會再次觸發此觸發器。
但如果執行另一個操作,它將觸發另一個觸發器。如果這個輔助動作應該首先觸發,那麼它將被觸發,因為這不是自觸發的。例如,UPDATE 觸發 ON UPDATE 執行 DELETE 觸發 ON DELETE 執行 UPDATE 導致 ON UPDATE… 等等,直到鏈由於缺少要被觸發器更改的行而停止。**所以使用這種交叉射擊要非常小心。**這可能會導致無限循環或過多的行修改(直到完成表清除)。
每當我刪除記錄時,觸發器似乎什麼都不做
您定義了每條語句觸發器(沒有 FOR EACH ROW),但操作看起來像每行觸發器。