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

所以很快,sql出来了:
delete from A a
where a.A3 in (
select A3 from A group by A3,A4
having count(A3) > 1
)
and a.id not in (
SELECT min(id) from A group by A3,A4
having count(A3) > 1
);
如果是mysql,这句sql肯定会报错。
错误地方很多:
比如delete语句不能用别名,delete from A a 这个肯定有问题。
去了这里,还会有问题,delete语句不能直接用where的select嵌套,
这里需要加上别名:
比如:
delete from A where A3 in(
select * from (
SELECT min(id) from A group by A3,A4
having count(A3) > 1 ) tem
);
到这里,差不多可以手工了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值