我将Ruby与SQLite3结合使用,但不幸的是,我在Sqlite3中使用外键的尝试均未成功。根据sqlite3 --version,安装了版本3.7.13。据我所知,Sqlite3从3.6.x版本开始支持外键。
sqlite3 --version
我知道默认情况下外键是禁用的,必须使用来激活PRAGMA foreign_keys = ON;。在我的db-create-script Ruby中,我正在执行以下操作:
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)
不幸的是,我可以愉快地将行插入requests未知的应用程序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)后 我不能 与未知app_ids插入行。
我想我可以回答我自己的问题:文档说:外键约束默认情况下是禁用的(为了向后兼容),因此必须分别为 每个数据库连接 启用外键约束。烦人,但现在终于可以使用了。