我使用Ruby与SQLite3和我尝试在Sqlite3中使用外键不幸成功。根据sqlite3 --version
,安装了版本3.7.13。据我所知,Sqlite3从版本3.6.x开始支持外键。SQLite3“忘记”使用外键
我知道外键默认是关闭的,必须用PRAGMA foreign_keys = ON;
激活。在我的红宝石DB创建脚本,我在做这样的事情:
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)
不幸的是,我可以高兴地插入几行requests
与未知的应用程序的IDS,它的工作原理,但当然不应该。
有趣的:直接使用sqlite3的外壳,我可以观察以下行为:
$ 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)后工作和我不允许插入未知app_id的行。
我认为我可以回答我自己的问题(在评论中,而不是由于低代表回答):文档说:外键约束默认情况下是禁用的(为了向后兼容),所以必须为每个数据库启用**连接**。讨厌,但它现在终于工作了。 – cara 2013-03-08 19:33:42
相关问题:如果添加了违反外键约束的数据并随后将foreign_keys标志设置为on:是否会导致错误? – gvrocha 2017-05-02 23:42:59