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

如何使用sqlite在C中激活外键?,c,sqlite,foreign-keys,C,Sqlite,Foreign Keys,我需要在我的程序中使用外键,但我不知道如何使用C语言激活这个PRAGMA。(我想使用级联模式。) 使用sqlite二进制,我只需编写PRAGMA foreign\u keys=on并且它可以工作 我的问题是:我如何在C中做到这一点?C完全相同-只需执行语句“PRAGMA foreign\u keys=ON”,手册的部分内容是: 为了在SQLite中使用外键约束,必须在编译库时既不定义SQLite_OMIT_foreign_键,也不定义SQLite_OMIT_触发器。如果定义了SQLITE_OMI

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

使用sqlite二进制,我只需编写PRAGMA foreign\u keys=on并且它可以工作


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

C完全相同-只需执行语句
“PRAGMA foreign\u keys=ON”

,手册的部分内容是:

为了在SQLite中使用外键约束,必须在编译库时既不定义SQLite_OMIT_foreign_键,也不定义SQLite_OMIT_触发器。如果定义了SQLITE_OMIT_触发器,但未定义SQLITE_OMIT_FOREIGN_KEY,则SQLITE的行为与3.6.19版之前的行为相同-解析外键定义,并可使用PRAGMA FOREIGN_KEY_list查询外键定义,但不强制外键约束。PRAGMA foreign_keys命令在此配置中是不可操作的。如果定义了“忽略外键”,则甚至无法解析外键定义(尝试指定外键定义是语法错误)

假设库是在启用外键约束的情况下编译的,则应用程序仍必须在运行时使用PRAGMA foreign_keys命令启用库。例如:

sqlite> PRAGMA foreign_keys = ON;
默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接启用外键约束。(但是,请注意,SQLite的未来版本可能会更改,以便在默认情况下启用外键约束。谨慎的开发人员不会对默认情况下是否启用外键做出任何假设,而是在必要时启用或禁用它们。)应用程序还可以使用PRAGMA foreign_keys语句来确定当前是否启用了外键

关于的页面上写着:

  • 在SQLite的未来版本中,可能会删除特定的pragma语句,并添加其他语句。不能保证向后兼容
  • 如果发出未知杂注,则不会生成错误消息。未知的杂注被忽略。这意味着如果pragma语句中有输入错误,库不会通知用户这一事实
  • 某些杂注在SQL编译阶段生效,而不是在执行阶段生效。这意味着如果使用C语言sqlite3_prepare()、sqlite3_step()、sqlite3_finalize()API(或包装器接口中的类似API),pragma可能会在sqlite3_prepare()调用期间运行,而不是像普通SQL语句那样在sqlite3_step()调用期间运行。或者,pragma可能在sqlite3_step()期间运行,就像正常的SQL语句一样。pragma是否在sqlite3_prepare()或sqlite3_step()期间运行取决于pragma和SQLite的特定版本
因此,您需要准备PRAGMA语句,并执行它以确保它生效


可能会有一个更专门的API;您也可以阅读手册。

好的,但是如何阅读呢?sqlite3_exec(db,“PRAGMA-foreign_-keys=ON”,NULL,NULL,NULL);工作不好,“不工作”可能意味着很多事情。您应该在每次调用SQLite API之后检查错误。你在任何时候都会出错吗?如果没有,你怎么知道它不起作用?对不起。。返回值是SQLITE_OK,但我这样说是因为我正在SQLITE>上与另一个示例测试一起编写C代码。因此,首先我在C函数中执行sql CREATE TABLE,然后使用相同的sql执行相同的操作,然后执行其他查询。。当我试图在外部表(UPDATE)中更改一个值时,在C程序中什么都没有发生,而在sqlite中,主表中的所有值都会更改。(对不起,我的英语,我是巴西人)PRAGMA foreign_keys=on;创建表table1(table1id整数主键,名称文本);创建表table2(num INTEGER主键,table1 INTEGER DEFAULT 0在DELETE SET DEFAULT的更新级联上引用table1(TABL1ID));在表1中插入值(0,'Default');在表1中插入值(1,'name1');在表2中插入数值(2000,1);在表2中插入数值(2001,1);在表2中插入数值(2002,1);从表2中选择*;更新table1设置table1id=2,其中name='name1';从表2中选择*;从表1中删除,其中name='name1';从表2中选择*;看来应该行得通。pragma可以在我自己的应用程序中使用。谢谢,但尝试过:sqlite3_prepare(db,“pragma foreign_keys=ON;”,-1,&stmt,0);sqlite3_步骤(stmt);步骤的结果是SQLITE_完成了,但是外键还没有工作。您是否检查了SQLITE库是如何构建的?请注意第一个报价中的要求-您必须构建SQLite以允许启用外键。它正在工作!!我不知道为什么,但我改变了电脑,使编译测试,有工作!!非常感谢,伙计!我很感激。