1. 程式人生 > >mysql 建立唯一索引前 刪除重複資料只保留id最小一條。

mysql 建立唯一索引前 刪除重複資料只保留id最小一條。

首先,現在的需求是: 
表A有5個欄位A1,A2,A3,A4,A5。 
現在的唯一索引是A1+A2;因為業務的調整,需要改成A3+A4。

解決辦法: 
1、第一步很簡單,先drop掉原unique索引:A1+A2。 
2、第二步,建立新unique,直接建立,想當然的報錯,存在重複資料。 
因此,需要第三步: 
3、刪除重複資料,只保留ID最小的一條: 
大致思路時,找到那些A3+A4都重複資料中,保留id最小的記錄。 
因此sql可以分兩部分: 
第一部分,根據A3+A4 in (重複資料); 
第二部分,並且id not in (重複資料的min(id))

這裡需要加上別名: 
比如: 
delete from A where A3 in( 
select * from ( 
SELECT min(id) from A group by A3,A4 
having count(A3) > 1 ) tem 
); 
到這裡,差不多可以手工了

現網情況是這樣的,本來唯一索引是 account_id, address, message_date,clinet_id

由於業務需要,暫時不需要clinet_id作為唯一索引了,需要改為account_id, address, message_date,還要刪除重複記錄,下面語句為

delete from t_cloud_message where message_date in(select * from (SELECT max(message_date) from t_cloud_message group by account_id, address, message_date having count(message_date) > 1 ) tem);