2011-01-06 19 views
4

我需要在我的程序中使用外键,但我不知道如何使用C语言激活此PRAGMA。 (我想用CASCADE模式。)如何使用sqlite激活C中的外键?

用sqlite二进制,我只写PRAGMA foreign_keys = on;,它的工作原理。

我的问题是:我如何在C中做到这一点?

回答

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页说:

  • 具体的注记语句可以被移除和其他的SQLite的未来版本中加入。不保证向后兼容性。
  • 如果发出未知的附注,则不会生成错误消息。未知的编译指示简单地被忽略。这意味着如果在编译指示语句中存在拼写错误,库不会通知用户这一事实。
  • 一些编译指示在SQL编译阶段生效,而不是执行阶段。这意味着如果使用C语言sqlite3_prepare(),sqlite3_step(),sqlite3_finalize()API(或类似的封装器接口),则该编译指示可以在sqlite3_prepare()调用期间运行,而不是在sqlite3_step()调用期间作为普通SQL声明做。或者,编译器可能会在sqlite3_step()期间运行,就像正常的SQL语句一样。是否在sqlite3_prepare()或sqlite3_step()期间运行编译指示取决于编译指示和SQLite的特定版本。

因此,您准备PRAGMA语句 - 并执行它以确保其生效。

可能有更专门的API;你也可以阅读手册。

2

C完全相同 - 只需执行语句"PRAGMA foreign_keys = ON"即可。

+0

好的,但如何? sqlite3_exec(db,“PRAGMA foreign_keys = ON”,NULL,NULL,NULL);不要工作 – Fabiano 2011-01-06 17:18:50

+0

那么,“不工作”可能意味着很多事情。每次调用SQLite API后,都应该检查错误。在任何时候你有错误吗?如果没有,你怎么知道它不起作用? – 2011-01-06 17:39:04