2013-03-08 51 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; 

請注意,它會影響您的所有數據庫...