如何在SQLite3中禁用递归触发器?

问题描述 投票:0回答:1

如果我正确理解递归触发器,对于这些表:

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。

sqlite
1个回答
0
投票

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;
© www.soinside.com 2019 - 2024. All rights reserved.