19

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

外部キーはデフォルトで非アクティブ化されており、を使用してアクティブ化する必要があることを知っていますPRAGMA foreign_keys = ON;。私のRubydb-create-scriptでは、次のようなことをしています。

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が、機能しますが、もちろんそうではありません。

興味深い: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シェルを終了しないと、外部キーアクティブ化した後に機能し(シェルを終了しません)、不明なapp_idを持つ行を挿入することはできません。

4

3 に答える 3

30

私は自分の質問に答えることができると思います:ドキュメントには次のように書かれています:外部キー制約はデフォルトで無効になっているため(下位互換性のため)、データベース接続ごとに個別に有効にする必要があります。迷惑ですが、ようやく機能しています。

于 2013-03-08T21:36:33.553 に答える
14

これをSQLコマンドを実行するファイルの先頭に配置すると、実行時に外部キーが有効になります。

db = SQLite3::Database.new("database.db")
db.execute("PRAGMA foreign_keys = ON")
于 2014-02-12T13:07:34.903 に答える
13

デフォルトでforeign_keysを永続的にオンにする1つの方法は、次の行を次のように挿入することです~/.sqliterc

PRAGMA foreign_keys = ON;

すべてのデータベースに影響することに注意してください...

于 2017-07-01T04:20:18.227 に答える