我使用以下语句创建了一个SQLite数据库:
" CREATE TABLE项目(Id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, productsIds TEXT,title TEXT,parentId INTEGER,FOREIGN KEY(parentId) 参考项目(Id)ON更新级联更新无操作);"
如您所见,我每个项目可能有0个或多个子项目。
我想删除所有子项目(以及子项目的子项目,依此类推),如果我删除了父项,但我删除了父项子项目未被删除。
插入行:
INSERT INTO Projects(id,productsIds,title,parentId)VALUES(?,?,?,?)
删除行:
DELETE FROM Projects WHERE id = 2
我正在使用FMDB。
你能帮忙解决这个问题吗?
由于
答案 0 :(得分:1)
您的问题可能是FOREIGN KEY支持尚未启用。为此,您可能需要发布/运行
pragma foreign_keys = ON;
按照: -
2。启用外键支持
为了在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,则为外键 甚至无法解析定义(尝试指定外键) 定义是语法错误。)
假设在编译库时启用了外键约束, 它必须仍然由应用程序在运行时启用,使用 PRAGMA foreign_keys命令。例如:
sqlite> PRAGMA foreign_keys = ON;
默认情况下禁用外键约束(对于向后键 兼容性),因此必须为每个数据库单独启用 连接。 (但请注意,SQLite的未来版本可能会 更改以便默认启用外键约束。小心 开发商不会对外国人做出任何假设 密钥默认启用,但将启用或禁用它们 必要的。)应用程序也可以使用PRAGMA foreign_keys 用于确定当前是否启用了外键的语句。该 以下命令行会话演示了这一点:
sqlite> PRAGMA foreign_keys; 0 sqlite> PRAGMA foreign_keys = ON; sqlite> PRAGMA foreign_keys; 1 sqlite> PRAGMA foreign_keys = OFF; sqlite> PRAGMA foreign_keys; 0
提示:如果命令" PRAGMA foreign_keys"不返回数据而不是a 单行包含" 0"或" 1",然后是您的SQLite版本 using不支持外键(因为它比它更旧) 3.6.19或因为它是使用SQLITE_OMIT_FOREIGN_KEY或SQLITE_OMIT_TRIGGER定义编译的。)
无法启用或禁用外键约束 多语句事务的中间(当SQLite不在时) 自动提交模式)。试图这样做不会返回错误;它 根本没有效果。