C语言 Sqlite Foreign Keys



我尝试使用jdbc -sqlite3 haskell库启用外键。这个库使用了一个小的辅助c函数

int sqlite3_open2(const char *filename, finalizeonce **ppo)

依次调用sqlite3_open 1。在sqlite文档中,我发现了一个很好的sqlite3_db_config函数,它应该启用外键。为了测试它,我在sqlite3_open2(清单的最后两行)中快速添加了2行:

int sqlite3_open2(const char *filename, finalizeonce **ppo) {
  sqlite3 *ppDb;
  finalizeonce *newobj;
  int res, *resFK, resFK1;
  fprintf(stderr, "DB pointer: %dn", ppDb);
  res = sqlite3_open(filename, &ppDb);
  resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);                    
  fprintf(stderr, "nForeign Keys: ON/OFF:%d  ERR:%dn", resFK, resFK1);  
  ...

我的惊喜是结果:Foreign Keys: ON/OFF:0 ERR:1

有人能给我一个提示我做错了什么,或者什么是启用外键的正确方式?

根据文档:

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

sqlite> PRAGMA foreign_keys = ON;

外键约束默认禁用(用于向后)兼容性),因此必须为每个数据库单独启用单独连接。

所以,在你的sqlite3_open()之后,你可能想要添加以下内容:
sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0);

我在使用 jdbc -sqlite3 API启用外键时遇到了困难,因为上面提到的PRAGMA需要在事务之外调用,并且库在建立连接和每次提交之后在后台打开一个新事务。但是解决方法很简单:

main = do
   conn <- connectSqlite3 "test.db"
   runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"

相关内容

  • 没有找到相关文章

最新更新