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'です。
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;
外部キー制約がある場合、これは機能しないことに注意してください。最初にそれらを削除し、後で追加し直す必要があります。
または、セッションold_alter_table = 1を設定してみてください(忘れずに設定してください!)
参照: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/
問題は、インデックスを作成しようとしているフィールドに重複したデータがあることです。一意のインデックスを追加する前に、問題の重複を削除する必要があります。
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;
これにより、一意のデータのみをテーブルに挿入できます