[英]How to use RECURSIVE TRIGGERS in SQLITE
在 SQLITE 中,我有一個名為Treeview
的樹形結構表,其中包含 colmns (Tag, Name, Checked, FatherTag)
。 基本上我想要做的是在所有子元素都為Checked
時UPDATE
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-name
和OLD.column-name
形式的引用訪問正在插入、刪除或更新的行的元素,其中 column-name 是表中列的名稱觸發器關聯的。OLD
和NEW
引用只能用於與它們相關的事件的觸發器中...... [請參閱相關文檔] 。
它們指的是正在更改的行,而不是表。
所以像(由於缺乏樣本表和數據而未經測試):
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.