mysql 创建唯一索引前 删除重复数据只保留id最小一条。

针对业务需求,从A表中删除A3+A4重复数据,仅保留ID最小的记录。操作包括移除原有唯一索引A1+A2,尝试创建新唯一索引A3+A4失败后,通过SQL查询找出重复数据并删除。使用子查询找到每个重复组的最小ID,然后进行删除操作。此外,还展示了在t_cloud_message表中,根据account_id, address, message_date删除重复记录的类似操作。" 78057353,7295335,Minnowboard安装Ubuntu 16.04 LTS桌面版教程,"['Ubuntu', '硬件安装', '工控设备', '系统升级', '教程']

首先,现在的需求是: 
表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); 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值