Database-Design

SQLite:你可以使用 DELETE 觸發器來刪除同一張表中的其他記錄嗎?

  • March 5, 2022

在這種特定情況下,我使用的是 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),但操作看起來像每行觸發器。

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