2013-03-08 71 views
10

我使用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的行。

+2

我认为我可以回答我自己的问题(在评论中,而不是由于低代表回答):文档说:外键约束默认情况下是禁用的(为了向后兼容),所以必须为每个数据库启用**连接**。讨厌,但它现在终于工作了。 – cara 2013-03-08 19:33:42

+0

相关问题:如果添加了违反外键约束的数据并随后将foreign_keys标志设置为on:是否会导致错误? – gvrocha 2017-05-02 23:42:59

回答

19

我想我可以回答我自己的问题:文档说:默认情况下禁用外键约束(为了向后兼容),所以必须为每个数据库连接分别启用。讨厌,但它现在终于工作了。

9

把它放在执行SQL命令的文件的顶部,它会在运行时启用外键。对foreign_keys默认永久转向

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

一种方法是注入以下行~/.sqliterc

PRAGMA foreign_keys = ON; 

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