「ALTER IGNORE」を使用して一意のインデックスを追加すると、重複を削除し、やりたいように聞こえる一意のレコードを強制することが役立つことがわかりました。したがって、構文は次のようになります。
ALTER IGNORE TABLE `table` ADD UNIQUE INDEX(`id`, `another_id`, `one_more_id`);
これにより、一意の制約が効果的に追加され、レコードが重複することがなくなり、IGNORE によって既存の重複が削除されます。
ここで ALTER IGNORE の詳細を読むことができます: http://mediakey.dk/~cc/mysql-remove-duplicate-entries/
更新: @Inquisitive から、これは MySql> 5.5 のバージョンでは失敗する可能性があると通知されました。
MySQL > 5.5 および InnoDB テーブル、および Percona では、InnoDB 高速インデックス作成機能 [ http://bugs.mysql.com/bug.php?id=40344]が原因で失敗します。この場合、最初に実行するset session old_alter_table=1
と、上記のコマンドが正常に機能します
更新 - ALTER IGNORE
5.7 で削除
ドキュメントから
MySQL 5.6.17 の時点で、 IGNORE 句は廃止され、その使用は警告を生成します。IGNORE は MySQL 5.7 で削除されました。
MySQL開発者の1人が2つの選択肢を提供しています:
- 上記のように、一意のフィールドでグループ化し、削除します
- 新しいテーブルを作成し、一意のインデックスを追加し、使用します
INSERT IGNORE
。例:
CREATE TABLE duplicate_row_table LIKE regular_row_table;
ALTER TABLE duplicate_row_table ADD UNIQUE INDEX (id, another_id);
INSERT IGNORE INTO duplicate_row_table SELECT * FROM regular_row_table;
DROP TABLE regular_row_table;
RENAME TABLE duplicate_row_table TO regular_row_table;
ただし、テーブルのサイズによっては、これは実用的ではない場合があります