テーブルから複数の行を削除しようとしているときに、データベースの関係が原因でそれらの行の 1 つを削除できない場合はどうなりますか?
リレーションシップによって制約されていない行は引き続き削除されますか? それとも、削除全体が失敗しますか?
テーブルから複数の行を削除しようとしているときに、データベースの関係が原因でそれらの行の 1 つを削除できない場合はどうなりますか?
リレーションシップによって制約されていない行は引き続き削除されますか? それとも、削除全体が失敗しますか?
MySQL では、外部キー制約を設定すると、存在しない ID を挿入しようとしたり、既存の ID を削除しようとすると、クエリが失敗します。
つまり、削除は失敗します。
単一の削除ステートメントの場合、削除全体が失敗します。
ここに、より一般的な質問があります。
答えは基本的に、「すでに成功しているものであっても、どれも影響を受けません」です。
内部で起こることはかなり複雑です。InnoDB はトランザクション セーブポイントをサポートし、データベースは現在のトランザクション内のステートメントの先頭に暗黙的なセーブポイントを作成します。ステートメントが途中で失敗すると、ロールバックが発生して暗黙のセーブポイントに戻ります。これは、ステートメントが発生しなかったように見えることを意味します (人々が READ_UNCOMMITTED 分離レベルの使用を主張する場合を除きますが、気にする必要はありません)。
これは、明示的なトランザクションを使用しているかどうかに関係なく発生します。明示的なトランザクションを使用している場合、現在のトランザクションはロールバックされません (デッドロックやロック待機タイムアウトなど、デッドロックを解除できるようにするために必要な特定の種類のエラーを除きます)。発言の冒頭。
すべての行が正常に削除されます。ただし、プログラムが関連する行を削除していることを確認する必要があります。そうしないと、投稿/レコードが失われます。