我需要在我的程序中使用外键,但我不知道如何使用C语言激活此PRAGMA。 (我想使用CASCADE模式。)
使用sqlite二进制文件,我只需编写 PRAGMA foreign_keys = on; 即可。
我的问题是:我如何在C中做到这一点?
答案 0 :(得分:5)
部分地,SQLLite手册说:
为了在SQLite中使用外键约束,必须在未定义SQLITE_OMIT_FOREIGN_KEY或SQLITE_OMIT_TRIGGER的情况下编译库。如果定义了SQLITE_OMIT_TRIGGER但SQLITE_OMIT_FOREIGN_KEY未定义,则SQLite的行为与版本3.6.19之前的行为相同 - 解析外键定义并使用PRAGMA foreign_key_list查询外键定义,但不强制执行外键约束。 PRAGMA foreign_keys命令在此配置中是无操作。如果定义了OMIT_FOREIGN_KEY,则甚至无法解析外键定义(尝试指定外键定义是语法错误)。
假设在启用外键约束的情况下编译库,应用程序在运行时仍必须使用PRAGMA foreign_keys命令启用它。例如:
sqlite> PRAGMA foreign_keys = ON;
默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用。 (但请注意,SQLite的未来版本可能会更改,以便默认情况下启用外键约束。小心的开发人员不会对默认情况下是否启用外键进行任何假设,而是根据需要启用或禁用它们。)应用程序也可以使用PRAGMA foreign_keys语句来确定当前是否启用了外键。
关于pragmas的网页说:
- 可能会删除特定的pragma语句,并在SQLite的未来版本中添加其他语句。无法保证向后兼容性。
- 如果发出未知的编译指示,则不会生成错误消息。简单地忽略未知的编译指示。这意味着如果pragma语句中存在拼写错误,则库不会通知用户该事实。
- 某些编译指示在SQL编译阶段生效,而不是在执行阶段生效。这意味着如果使用C语言sqlite3_prepare(),sqlite3_step(),sqlite3_finalize()API(或包装器接口中的类似),pragma可以在sqlite3_prepare()调用期间运行,而不是在sqlite3_step()调用期间作为普通SQL运行陈述呢。或者pragma可能在sqlite3_step()期间运行,就像普通的SQL语句一样。 pragma在sqlite3_prepare()或sqlite3_step()期间是否运行取决于pragma和SQLite的特定版本。
因此,您准备PRAGMA语句 - 并执行它以确保它生效。
可能有一个更专业的API;你也可以阅读这本手册。
答案 1 :(得分:2)
C完全相同 - 只需执行语句"PRAGMA foreign_keys = ON"
。