Edited at

[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
);


参考