2013-03-08 4 views
10

私はSQLite3でRubyを使用していますが、Sqlite3で外部キーを使用しようとしましたが、残念ながら成功しませんでした。 sqlite3 --versionによれば、バージョン3.7.13がインストールされています。私の知る限り、Sqlite3はバージョン3.6.x以降の外部キーをサポートしています。SQLite3が外部キーを使用するのを忘れる

外部キーはデフォルトで無効になっており、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) 

残念ながら、私は喜んで、未知のapp-IDを持つrequestsに行を挿入することができますが、もちろんそれはいけない:私のRubyのDB作成スクリプトでは、私はこのような何かをやっています。

興味深い:直接sqlite3のシェルを使用して、私は次の動作を観察することができます: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 ?! 

を、それらを活性化(およびシェルを終了しない)の後に取り組んでいる外部キーとにapp_idsが不明な行を挿入することは許可されていません。

+2

...それはすべてのデータベースに影響を与えることに注意してくださいI私の質問に答えることができると思う(低い担当者の回答ではなく、コメントの中で)。ドキュメントによれば、外来キーの制約はデフォルトで無効になっているため、データベースごとに有効にする必要がある別途接続**。迷惑ですが、最終的には今働いています。 – cara

+0

関連する質問:外部キー制約に違反するデータが追加され、その後にforeign_keysフラグがonに設定されている場合:これはエラーを引き起こしますか? – gvrocha

答えて

19

私は自分の質問に答えることができると思います:ドキュメントでは、外来キーの制約はデフォルトで無効になっています(下位互換性のため)。各データベース接続を個別に有効にする必要があります。迷惑ですが、最終的には今働いています。

9

SQLコマンドを実行するファイルの先頭にこれを置くと、実行時に外部キーが有効になります。永久にデフォルトでFOREIGN_KEYSをオンにするの

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

一つの方法は、~/.sqlitercに次の行を注入することである。

PRAGMA foreign_keys = ON; 

関連する問題