私は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が不明な行を挿入することは許可されていません。
...それはすべてのデータベースに影響を与えることに注意してくださいI私の質問に答えることができると思う(低い担当者の回答ではなく、コメントの中で)。ドキュメントによれば、外来キーの制約はデフォルトで無効になっているため、データベースごとに有効にする必要がある別途接続**。迷惑ですが、最終的には今働いています。 – cara
関連する質問:外部キー制約に違反するデータが追加され、その後にforeign_keysフラグがonに設定されている場合:これはエラーを引き起こしますか? – gvrocha