MySQL
SQL

[SQL]重複データを1件だけ残して削除する方法

More than 1 year has passed since last update.

いつの間にか重複データが大量に保存されていて、データメンテをSQLで対応した時のメモです。
先人の知恵、すばらしいですね。

※注釈
使っている環境によっては @yuba さんのSQLで実行できます。
残念ながら、MySQLではdelete文にテーブル別名を指定できません。

環境

  • MySQL 5.6.30

対応方法

ロジックは簡単で、重複を除いたデータを使ってそれ以外を削除します。
今回は残したいid(primary key)を生成して、それ以外のデータを削除します。

# (確認)残したいデータを検索する
select min(id) from table_a group by column1,column2;

# 残したいデータ以外を削除する
# そのままだと削除できないので、サブクエリの中でテーブルを作成
delete from table_a
 where id not in
 (
  select tmp1.id from (
    select min(id) as id
    from table_a
    group by tmp1.column1,tmp1.column2
  ) as tmp1
 );

参考