6

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

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

依次调用sqlite3_open。在sqlite 文档中,我发现了sqlite3_db_config应该启用外键的不错的功能。为了测试它,我快速添加了 2 行sqlite3_open2(清单的最后两行):

int sqlite3_open2(const char *filename, finalizeonce **ppo) {
  sqlite3 *ppDb;
  finalizeonce *newobj;
  int res, *resFK, resFK1;

  fprintf(stderr, "DB pointer: %d\n", ppDb);

  res = sqlite3_open(filename, &ppDb);

  resFK1 = sqlite3_db_config(ppDb, 1002, 1, resFK);                    
  fprintf(stderr, "\nForeign Keys: ON/OFF:%d  ERR:%d\n", resFK, resFK1);  

  ...

结果令我惊讶:Foreign Keys: ON/OFF:0 ERR:1.

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

4

2 回答 2

6

根据文档

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

sqlite> PRAGMA foreign_keys = ON;

默认情况下禁用外键约束(为了向后兼容),因此必须分别为每个数据库连接单独启用。

因此,在您的 之后sqlite3_open(),您可能需要添加以下内容:

sqlite3_exec(ppDb, "PRAGMA foreign_keys = ON;", 0, 0, 0);
于 2011-12-06T23:04:29.893 回答
3

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

main = do
   conn <- connectSqlite3 "test.db"
   runRaw conn "COMMIT; PRAGMA foreign_keys = ON; BEGIN TRANSACTION"
于 2011-12-09T21:50:28.820 回答