我正在使用Ruby和SQLite3,但我的外键在Sqlite3中的尝试不幸没有成功。根据sqlite3 --version
,安装了版本3.7.13。据我所知,自版本3.6.x以来,Sqlite3支持外键。
我知道默认情况下外键是被禁用的,需要使用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)
很不幸,我可以愉快地插入以未知 app-ids 为标识的行到 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_ids的行。