SQLite3 では、外部キー制約はデフォルトでは強制されません。この動作は他のほとんどのリレーショナル データベース管理システム (RDBMS) とは異なるため、堅牢な制約の適用に慣れている開発者の間で混乱が生じます。
次の例を考えてみましょう: 2 つのテーブル、Persons を作成します。 Orders には、Persons の主キーを参照する外部キー制約があります。この制約が定義されているにもかかわらず、Persons に対応するレコードがなくても Orders に行を挿入できます。
SQLite3 バージョン 3.x 以前では、外部キー制約を明示的に指定する必要があります。データベースに接続するたびに次のクエリを使用して有効にします:
PRAGMA foreign_keys = ON;
これは、SQLite3 が以前のバージョンとの下位互換性を維持しているためです。
デフォルトで外部キーの強制を無効にするという決定は、主に、SQLite の組み込みデータベースとしての SQLite の伝統によって決定されました。パフォーマンスが重要なアプリケーションで使用します。外部キー制約は、特に同時実行性の高いシナリオでパフォーマンスに影響を与える可能性があります。
SQLite4.x では、外部キー制約がデフォルトで有効になります。この変更は、現在の動作によって引き起こされる潜在的な混乱と不満に対処します。
提供された例のコンテキストでは、PRAGMA foreign_keys = ON; を実行する必要があります。外部キーの強制を有効にするステートメント。その後、個人に対応するレコードがない状態でレコードを注文に挿入すると、予想どおりエラーが発生します。
以上がSQLite3 がデフォルトで外部キー制約を強制しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。