MySql 刪除表中重複的數據(但要保留一條)

【補充一下】經過 KimZing 同學提醒,mysql5.7不會默認給一個id,但我們可以在查詢條件種加上 min(id)

今天遇到一個問題。相同的數據在同一張表裏出現了多次。我的需求是刪除多餘的數據,但要保留其中一條。
定義 表名 table_a ,判斷唯一的兩個字段 c_1,c_2,無關字段data
表中原始數據如下
這裏寫圖片描述
首先我們要查看數據庫中那些數據重複了,執行如下SQL

SELECT * FROM 
(SELECT COUNT(*) as num,c_1,c_2,min(id) as id FROM table_a GROUP BY c_1,c_2)e 
WHERE e.num>1;

結果如下
這裏寫圖片描述
其中num字段爲 數據出現的次數,可以發現我們已經找出了出現重複的數據,那麼我們該怎麼去除其中多餘的數據呢。
我的思路是:再查詢一個id 字段 ,我們group by 的時候 id 字段只能查詢到重複數據中的一條。然後我們把這些id的數據刪除,就達到了去重的效果。SQL 如下

DELETE FROM table_a 
WHERE id IN 
(SELECT e.id FROM (SELECT COUNT(*) as num,c_1,c_2,min(id) as id FROM table_a GROUP BY c_1,c_2)e WHERE e.num>1);

2018-01-20 更新:
突然想到一個更好的方法,SQL如下:

DELETE FROM table_a 
WHERE id IN 
(SELECT id FROM (SELECT id FROM table_a GROUP BY c_1,c_2 HAVING count(*) > 1)e);

執行:
這裏寫圖片描述
可以看到有兩行被刪除了。這時再看看數據表,數據已經變成了:

這裏寫圖片描述

成功將重複的數據刪除。

如果重複數據是三條或者更多怎麼辦呢?很簡單,再多執行幾次這個SQL 就好了。

最後,別忘了給字段加個唯一索引,避免數據再出問題

如果有幫到您,打個賞唄

在這裏插入圖片描述

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章