web-dev-qa-db-ja.com

MySQL:ALTER IGNORE TABLEにより「整合性制約違反」が発生する

ALTER IGNORE TABLE + UNIQUE KEYを使用して、MySQLテーブルから重複を削除しようとしています。 MySQLのドキュメントには次のように書かれています:

IGNOREは、標準SQLに対するMySQL拡張機能です。新しいテーブルの一意のキーに重複がある場合、または厳格モードが有効になっているときに警告が発生する場合、ALTER TABLEの動作を制御します。 IGNOREが指定されていない場合、重複キーエラーが発生するとコピーは中止され、ロールバックされます。 IGNOREが指定されている場合、一意のキーに重複する行の最初の行のみが使用されます。他の競合する行は削除されます。誤った値は、最も近い一致する許容値に切り捨てられます。

クエリを実行すると...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

...それでもエラーが発生します#1062-重複したエントリ 'blabla'がキー 'dupidx'です。

47
Philippe Gerber

MySQLのIGNOREキーワード拡張は、MySQLの一部のバージョンで InnoDBバージョンのバグ を持っているようです。

常にMyISAMに変換し、インデックスをIGNORE-ADDしてから、InnoDBに戻すことができます

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

外部キー制約がある場合、これは機能しないことに注意してください。最初にそれらを削除し、後で追加し直す必要があります。

96
Emma

または、セッションold_alter_table = 1を設定してみてください(忘れずに設定してください!)

参照: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/

26

問題は、インデックスを作成しようとしているフィールドに重複したデータがあることです。一意のインデックスを追加する前に、問題の重複を削除する必要があります。

1つの方法は、次のことを行うことです。

   CREATE TABLE tmp_table LIKE table;
   ALTER IGNORE TABLE tmp_table ADD UNIQUE INDEX dupidx (field);
   INSERT IGNORE INTO tmp_table SELECT * FROM table;
   DROP TABLE table;
   RENAME TABLE tmp_table TO table;

これにより、一意のデータのみをテーブルに挿入できます

3
Glen Solsberry