FMDB级联自引用键

时间:2018-06-15 15:49:10

标签: ios database sqlite fmdb

我使用以下语句创建了一个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。

你能帮忙解决这个问题吗?

由于

1 个答案:

答案 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不在时)   自动提交模式)。试图这样做不会返回错误;它   根本没有效果。

SQLite Foreign Key Support