この質問のように、私は PoEAA を読んでいて、MySQL でコミットするまで参照整合性チェックを延期することが可能かどうか疑問に思っていました。
一連の製品と関連製品を同じコミットに挿入したいときに、この問題に遭遇しました。related_products
トランザクション内でも、結合テーブルに挿入しようとすると制約エラーが発生します。
それが役立つ場合は、データベース接続に PHP PDO を使用しています。
ご協力いただければ幸いです。
この質問のように、私は PoEAA を読んでいて、MySQL でコミットするまで参照整合性チェックを延期することが可能かどうか疑問に思っていました。
一連の製品と関連製品を同じコミットに挿入したいときに、この問題に遭遇しました。related_products
トランザクション内でも、結合テーブルに挿入しようとすると制約エラーが発生します。
それが役立つ場合は、データベース接続に PHP PDO を使用しています。
ご協力いただければ幸いです。
私の答えはここにあるようです...
一般的な MySQL と同様に、多くの行を挿入、削除、または更新する SQL ステートメントでは、InnoDB は UNIQUE および FOREIGN KEY 制約を行ごとにチェックします。外部キー チェックを実行する場合、 InnoDB は、参照する必要がある子レコードまたは親レコードに共有行レベル ロックを設定します。InnoDB はすぐに外部キー制約をチェックします。チェックはトランザクションのコミットまで延期されません。SQL 標準によると、デフォルトの動作は遅延チェックです。つまり、制約は、SQL ステートメント全体が処理された後にのみチェックされます。InnoDB が遅延制約チェックを実装するまでは、外部キーを使用して自分自身を参照するレコードを削除するなど、いくつかのことが不可能になります。
ふりだしに戻る。
DEFERRABLE
MySQLが外部キーの属性 (オプションを含む) をサポートしているかどうかを尋ねる場合INITIALLY DEFERRED
、答えは明確にノーです。
MySQL では、コミット時まで制約チェックを延期することはできません。
そして、すでに指摘したように、それらは常に「ステートメントレベル」ではなく「行レベル」で評価されます。
サーバー変数を設定して外部キー チェックを一時的に無効にすることで、innodb エンジンのこの制限を処理できます。
set foreign_key_checks=0;
MySQL マニュアルから:
mysqldump は、ダンプ ファイル内のテーブルの正しい定義も生成し、外部キーを忘れません。
外部キー関係を持つテーブルのダンプ ファイルを簡単にリロードできるようにするために、mysqldump は自動的にダンプ出力にステートメントを含め、foreign_key_checks を 0 に設定します。これにより、ダンプのリロード時に特定の順序でテーブルをリロードしなければならないという問題が回避されます。この変数を手動で設定することもできます。
mysql> SET foreign_key_checks = 0;
mysql> SOURCE dump_file_name;
mysql> SET foreign_key_checks = 1;