如何使用sqlite在C中激活外键?

时间:2011-01-06 13:55:26

标签: c sqlite foreign-keys

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

使用sqlite二进制文件,我只需编写 PRAGMA foreign_keys = on; 即可。

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

2 个答案:

答案 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"