0

外部キー制約のある複雑なスキーマでMySQL5.5を使用しています。

update複数のdeleteSQLステートメントを実行したい。

これらのステートメントのサブセットが実行された後、外部キー制約違反が発生する可能性があります。

これらのステートメントがすべて実行された後は、外部キー制約違反があってはなりません。

いくつかcascadeの変更にはより複雑なロジックが必要なため、使用したくありません。

私の質問は、外部キー制約がすべて完了するまでチェックされないように、複数のステートメントを(複数のステートメント、トランザクションなどとして)組み合わせる方法はありますか?(そして、それらのどれも実行されないよりもエラーがある場合は?)

4

1 に答える 1

1

MySQLは遅延制約チェックを実装していません。マニュアルから、

SQL標準からの逸脱:一般的なMySQLと同様に、多くの行を挿入、削除、または更新するSQLステートメントで、InnoDBはUNIQUEおよびFOREIGNKEY制約を行ごとにチェックします。外部キーチェックを実行する場合、InnoDBは、参照する必要のある子レコードまたは親レコードに共有行レベルのロックを設定します。InnoDBは外部キー制約をすぐにチェックします。チェックはトランザクションコミットに延期されません。 SQL標準によると、デフォルトの動作は遅延チェックである必要があります。つまり、制約はSQLステートメント全体が処理された後にのみチェックされます。InnoDBが遅延制約チェックを実装するまで、外部キーを使用してそれ自体を参照するレコードを削除するなど、いくつかのことは不可能です。

したがって、SQLステートメントのグループの最後でのみ制約をチェックする方法はありません。

于 2012-12-16T09:33:57.623 に答える