代码之家  ›  专栏  ›  技术社区  ›  Red Mak

自引用密钥上的fmdb级联

  •  0
  • Red Mak  · 技术社区  · 8 年前

    我使用以下语句创建了一个sqlite数据库:

    “创建表项目(id integer不为空主键autoincrement, productSids文本,标题文本,parentID整数,外键(parentID) 在更新时引用删除级联的项目(ID)无操作);“

    如您所见,我每个项目可能有0个或多个子项目。

    如果删除父项目,我想删除所有子项目(以及子项目的子项目,等等),但我删除的父子项目不会被删除。

    插入行:

    插入到项目(id、productsids、title、parentid)中的值(?,?,??)

    删除行:

    从id=2的项目中删除

    我正在使用fmdb。

    你能帮忙吗

    谢谢

    1 回复  |  直到 8 年前
        1
  •  1
  •   MikeT    8 年前

    您的问题可能是尚未启用外键支持。为此,您可能需要发布/运行

    pragma foreign_keys = ON;
    

    按:

    2。启用外键支持

    为了在sqlite中使用外键约束,库必须是 编译时既不使用sqlite_omit_foreign_key也不使用sqlite_omit_触发器 定义。如果定义了sqlite_omit_触发器,但sqlite_omit_foreign_键 不是,则sqlite的行为与版本3.6.19之前的行为相同 (2009-10-14)-分析外键定义并可以查询 使用pragma foreign_key_list,但外键约束不是 强制执行的pragma foreign_keys命令在此中是一个no操作 配置。如果定义了省略外键,则外键 甚至无法分析定义(试图指定外键 定义是语法错误)。

    假设在编译库时启用了外键约束, 应用程序在运行时仍必须启用它,使用 pragma foreign_keys命令。例如:

    sqlite> PRAGMA foreign_keys = ON;
    

    默认情况下禁用外键约束(用于向后 兼容性),因此必须分别为每个数据库启用 连接。(但是,请注意,sqlite的未来版本可能 更改为默认启用外键约束。小心 开发商不会对是否是外国公司做出任何假设 默认情况下,键是启用的,但将作为 必要的。)应用程序还可以使用pragma foreign_键 语句来确定当前是否启用外键。这个 下面的命令行会话演示了这一点:

    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”不返回数据,而是返回 包含“0”或“1”的单行,则为 使用不支持外键(因为它比 3.6.19或因为它是用sqlite_omit_foreign_key或定义的sqlite_omit_触发器编译的)。

    无法在中启用或禁用外键约束。 多语句事务的中间(当sqlite不在 自动提交模式)。尝试这样做不会返回错误;它 根本没有效果。

    SQLite Foreign Key Support

    推荐文章