SQLite3“忘记”使用外键

时间:2013-03-08 19:19:33

标签: sql ruby sqlite raspbian

我正在使用Ruby和SQLite3,但我在Sqlite3中尝试使用外键的尝试很不幸。根据{{​​1}},安装了版本3.7.13。据我所知,自版本3.6.x以来,Sqlite3支持外键。

我知道默认情况下外键已停用,必须使用sqlite3 --version激活。在我的Ruby db-create-script中,我正在做这样的事情:

PRAGMA foreign_keys = ON;

不幸的是,我很乐意在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) 中使用未知的app-id插入行,它可以工作,但当然不应该。

有趣:直接使用sqlite3 shell,我可以观察到以下行为:

requests

在不退出sqlite3 shell的情况下,外键正在激活它们(而不是退出shell)我不允许插入包含未知app_ids的行。

3 个答案:

答案 0 :(得分:25)

我想我可以回答我自己的问题:文档说:默认情况下禁用外键约束(为了向后兼容),因此必须单独启用每个数据库连接。很烦人,但它现在终于有效了。

答案 1 :(得分:10)

将它放在执行SQL命令的文件的顶部,它将在运行时启用外键。

db = SQLite3::Database.new("database.db")
db.execute("PRAGMA foreign_keys = ON")

答案 2 :(得分:6)

默认情况下永久启用 foreign_keys 的一种方法是将以下行注入~/.sqliterc

PRAGMA foreign_keys = ON;

请注意,它会影响您的所有数据库......