我使用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