我尝试使用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"