【发布时间】:2013-02-24 10:46:27
【问题描述】:
我在 SQLite3 中使用 Ruby,但很遗憾,我尝试在 Sqlite3 中使用外键没有成功。根据sqlite3 --version,安装的是3.7.13版本。据我所知,Sqlite3 从 3.6.x 版本开始支持外键。
我知道外键默认是停用的,必须使用PRAGMA foreign_keys = ON; 激活。在我的 Ruby db-create-script 中,我正在做这样的事情:
sql = <<-SQL
PRAGMA foreign_keys = ON;
CREATE TABLE apps (
id ....
);
CREATE TABLE requests (
...
app_id INTEGER NOT NULL,
FOREIGN KEY(app_id) REFERENCES apps(id),
);
...
SQL
db.execute_batch(sql)
不幸的是,我可以很高兴地将行插入到具有未知应用程序 ID 的 requests,它可以工作,但当然不应该。
有趣:直接使用 sqlite3 shell,我可以观察到以下行为:
$ sqlite3 database.db
sqlite> PRAGMA foreign_keys = ON;
sqlite> PRAGMA foreign_keys;
1 // as expected
sqlite> .quit
$ sqlite3 database.db
sqlite> PRAGMA foreign_keys;
0 // off ?!
在不退出 sqlite3 shell 的情况下,外键在激活后正在工作(而不是退出 shell)并且我不允许插入具有未知 app_id 的行。
【问题讨论】:
-
我想我可以回答我自己的问题(在评论中而不是由于低代表的答案):文档说:外键约束默认禁用(为了向后兼容),所以必须分别为每个数据库连接启用。烦人,但它现在终于可以工作了。
-
相关问题:如果添加了违反外键约束的数据并且随后将foreign_keys标志设置为on:这会导致错误吗?