我试图删除父表中的条目,但子表中的相应条目没有像我预期的那样被删除。这是我创建的两个表:
CREATE TABLE
IF NOT EXISTS "pages" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"title" TEXT,
"author" TEXT REFERENCES users(id) ON DELETE CASCADE ON UPDATE CASCADE,
"creation_date" DATE,
"publication_date" DATE
);
CREATE TABLE
IF NOT EXISTS "blocks"(
"id" INTEGER PRIMARY KEY AUTOINCREMENT,
"page_id" INTEGER REFERENCES pages(id) ON DELETE CASCADE ON UPDATE CASCADE,
"type" TEXT,
"content" TEXT,
"position" INTEGER
);
这是我正在运行的查询:
DELETE FROM pages WHERE id = ?
pages表的条目被正确删除,但删除不会传播。我还添加了PRAGMA foreign_keys = ON;
指令,但这并没有解决问题。任何帮助将不胜感激。
1条答案
按热度按时间1qczuiv01#
正如下面的演示所示,您所展示的内容似乎没有任何问题,因此,要么
PRAGMA foreign_keys = ON;
不工作,或者,关于
PRAGMA foreign_keys = ON;
不工作。考虑以下情况:为了在SQLite中使用外键约束,必须在编译库时既不定义SQLITE_OMIT_FOREIGN_KEY也不定义SQLITE_OMIT_TRIGGER。如果定义了SQLITE_OMIT_TRIGGER但没有定义SQLITE_OMIT_FOREIGN_KEY,则SQLite的行为与版本3.6.19(2009-10-14)之前的行为相同-外键定义被解析,并且可以使用PRAGMA foreign_key_list进行查询,但不强制执行外键约束。PRAGMA foreign_keys命令在此配置中是无操作的。如果定义了OMIT_FOREIGN_KEY,那么外键定义甚至不能被解析(试图指定外键定义是一个语法错误)。参见https://www.sqlite.org/foreignkeys.html#fk_enable
工作演示
以下是您删除的影响,可用作测试的基础:
结果
foreign_keys 1
foreign_keys 0
foreign_keys 1
*即删除id为4的页面行导致相关块行通过传播被删除