SQLiteでは、外部キーのサポートが有効になっていない限り、外部キーの制約は適用されません。
外部キーを有効にするには、次のことが必要です。
- SQLiteのコンパイル時に外部キーを有効にします。
- 実行時に外部キーを有効にします。
SQLiteのコンパイル時に外部キーを有効にする
SQLiteのコンパイルに関しては、有効化の問題ではありません。 外部キー–それは無効にしないの問題です それら。
SQLiteのコンパイル時に外部キーを有効にするということは、単にSQLITE_OMIT_FOREIGN_KEY
を使用しないことを意味します。 およびSQLITE_OMIT_TRIGGER
コンパイルするとき。
SQLITE_OMIT_TRIGGER
の場合 定義されていますが、SQLITE_OMIT_FOREIGN_KEY
そうでない場合、外部キー定義が解析され、PRAGMA foreign_key_list
を使用して照会できます。 、ただし、外部キー制約は適用されません。 PRAGMA foreign_keys
この構成では、コマンドは何も実行されません。
OMIT_FOREIGN_KEY
の場合 が定義されている場合、外部キー定義を解析することもできません(外部キー定義を指定しようとすると、構文エラーになります)。
実行時に外部キーを有効にする
ライブラリが外部キー制約を有効にしてコンパイルされている場合でも、実行時に外部キーのサポートを有効にする必要があります。
これは、次のコードで実行できます。
PRAGMA foreign_keys = ON;
ほとんどのPRAGMA
と同様に ステートメントの場合は、代わりにON
を置き換えることもできます TRUE
を使用 、YES
、または1
。
これを実行すると、外部キーが適用されます。
この設定は作成には必要ないことに注意してください 外部キー。ただし、強制には必須です。 外部キー。
その他の接続
これにより、現在のデータベース接続の外部キー制約のみが有効になることに注意してください。
新しい接続を開く場合、その接続で外部キーを適用する場合は、そのステートメントを再度実行する必要があります。
現在の接続の外部キーサポートを確認する
次のコードを実行して、現在の接続で外部キーがすでに有効になっているかどうかを確認することもできます。
PRAGMA foreign_keys;
結果:
1
私の場合、この接続に対して外部キーをすでに有効にしているため、結果は1になります。外部キーが無効になっている場合、結果は0になります。
無効にして値を確認してから、有効にして値を再確認する例を次に示します。
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
結果:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1