1

最近、データベースを別のサーバーに移行しました。

古いサーバーでは、InnoDB の ON DELETE CASCADE ルールを多用しました。

新しいサーバーでは、MySql に InnoDB エンジンが設定されていませんでした。

移行の時点で、新しいサーバーは MyISAM にデフォルト設定されていましたが、私は今までこれに気づきませんでした。(頭を壁にぶつけて!)

状況は次のとおりです。データベースが使用されているため、ON DELETE CASCADE ルールを使用していたテーブルの一部が同期しなくなりました。(まだ頭を壁にぶつけている。)

つまり、テーブルを InnoDB に変更してカスケード ルールを再適用することはできません。キーの一部は、存在しなくなった行を参照するようになりました。

私の質問はこれです:

挿入されている行のいずれかがカスケード規則に違反している場合、その行を黙って無視して次の行に移動するように INSERT ステートメントを構成する方法はありますか? (最初は、INSERT IGNORE でこれを達成できると思っていましたが、試してみましたが、うまくいかないようです。)

よろしくお願いいたします。

4

1 に答える 1

0

ステップ1

バックアップを作成する

ステップ2

SET foreign_key_checks = 0;

Migrate your data

SET foreign_key_checks = 1;

ステップ3

DELETE FROM table WHERE id NOT IN (SELECT foreign_key_id FROM table2);

削除ステートメントがON DELETE CASCADEルールに一致する場所。
削除を行う順序は重要であることを忘れないでください。そのため、必要に応じて途中で追加のバックアップを計画して作成してください。

バックアップが完了したら、もう一度バックアップ SQL ステートメントを編集して、行SET foreign_key_checks = xが存在しないようにします。外部キー チェックを有効にしたバックアップが機能する場合は、業務を再開できます。

IN私の 2 セントだけで、より効率的な削除クエリを理解できると確信しています。

于 2011-04-15T18:22:59.173 に答える