簡體   English   中英

如何在 SQLITE 中使用遞歸觸發器

[英]How to use RECURSIVE TRIGGERS in SQLITE

在 SQLITE 中,我有一個名為Treeview的樹形結構表,其中包含 colmns (Tag, Name, Checked, FatherTag) 基本上我想要做的是在所有子元素都為CheckedUPDATE Checked Father 元素。

為此,我有一個在開始遞歸查詢時啟動的觸發器。 此觸發器應該在已更新時修改Checked列。

CREATE TRIGGER tr_update_father_Checked
         AFTER UPDATE OF Checked
            ON Treeview
BEGIN
    UPDATE Treeview
       SET Checked = (
               SELECT Checked
                 FROM NEW
                WHERE Tag = Treeview.Tag
           )
     WHERE Tag IN (
        SELECT FatherTag
          FROM NEW
    );
END;

一旦我打開觸發器,我就會對 select 運行我的遞歸查詢,並修改一個Checked元素。

    WITH RECURSIVE cte_Treeview (
    Tag,
    DisplayedName,
    FatherTag,
    NodeIndex,
    Checked
)
AS (
    SELECT t.Tag,
           t.DisplayedName,
           t.FatherTag,
           t.NodeIndex,
           t.Checked
      FROM Treeview t
     WHERE t.Tag = 1
    UNION ALL
    SELECT t.Tag,
           t.DisplayedName,
           t.FatherTag,
           t.NodeIndex,
           t.checked
      FROM Treeview t
           JOIN
           cte_Treeview c ON c.Tag = t.FatherTag
     LIMIT 12
)

UPDATE Treeview
SET "Checked" = "R"
WHERE Tag = 2;

我得到一個:

沒有這樣的表:main.NEW

有人可以告訴我我做錯了什么嗎?

謝謝你。

首先,要使用遞歸觸發器,您必須在每個數據庫連接上啟用它(就像外鍵一樣):

PRAGMA recursive_triggers = on;

其次,您嘗試像使用表格一樣使用NEW 它不是。 正如文件所說,

WHEN子句和觸發器操作都可以使用NEW.column-nameOLD.column-name形式的引用訪問正在插入、刪除或更新的行的元素,其中 column-name 是表中列的名稱觸發器關聯的。 OLDNEW引用只能用於與它們相關的事件的觸發器中...... [請參閱相關文檔]

它們指的是正在更改的,而不是表。

所以像(由於缺乏樣本表和數據而未經測試):

CREATE TRIGGER tr_update_father_Checked
         AFTER UPDATE OF Checked
            ON Treeview
BEGIN
    UPDATE Treeview SET Checked = NEW.Checked WHERE Tag = NEW.FatherTag;
END;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM