如果我正确理解递归触发器,对于这些表:
CREATE TABLE ids (
id INTEGER PRIMARY KEY ON CONFLICT REPLACE
);
CREATE TABLE some_data (
id INTEGER REFERENCES ids (id) ON DELETE CASCADE
ON UPDATE CASCADE,
data TEXT
);
当表id出现冲突时,应执行
REPLACE
,即先删除,再添加新值。根据 documentation:,仅当启用
recursive trigger
时,此删除才应级联
当 REPLACE 冲突解决策略删除行以满足约束时,当且仅当启用递归触发器时,删除触发器才会触发。
我知道有以下代码:
PRAGMA recursive_triggers = OFF;
PRAGMA recursive_triggers;
INSERT INTO ids (id) VALUES (1);
INSERT INTO ids (id) VALUES (2);
INSERT INTO some_data (id, data) VALUES (1, "addds");
UPDATE ids SET id = 1 WHERE id = 2;
表中的数据
some_data
不应该被删除,但已经被删除了。在这种情况下,我该怎么做才能不递归触发ON DELETE CASCADE
?
我的SQLite版本是3.35.4。
CASCADE动作不是触发器,因此不被递归触发器覆盖;它们类似于:- sqlite.org/foreignkeys.html#fk_actions
在这种情况下,我该怎么做才能不递归触发 ON DELETE CASCADE?
也许可以考虑对您的代码进行以下调整,其中更新之前有免费更新。级联在哪里
更新在随后的更新之前有效地进行级联(然后将隐式删除级联到子级):-
DROP TABLE IF EXISTS some_data;
DROP TABLE IF EXISTS ids;
CREATE TABLE IF NOT EXISTS ids (
id INTEGER PRIMARY KEY ON CONFLICT REPLACE
);
CREATE TABLE IF NOT EXISTS some_data (
id INTEGER REFERENCES ids (id) ON DELETE CASCADE
ON UPDATE CASCADE,
data TEXT
);
INSERT INTO ids (id) VALUES (1);
INSERT INTO ids (id) VALUES (2);
INSERT INTO some_data (id, data) VALUES (1, 'addds');
UPDATE some_data SET id = 2 WHERE id = 1; /*<<<<<<<<<< ADDED UPDATE */
UPDATE ids SET id = 1 WHERE id = 2;