Mysql删除重复数据并解决You can't specify target table 'xx' for update in FROM clause 报错与 query interrupted报错

哇,这个问题在纠结了N个小时总算解决了!

解决方案:

-- 在命令行方式中输入
delete from 表名 where id 
in (select id from (
    select id from 表名
    where (表名.字段1,表名.字段2) 
    in (select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*) > 1)
    and id not in (select min(id)  from 表名 group by 字段1,字段2 having count(*)>1) 
)as temp );
  1. 在mysql命令行模式下(不能使用workbench)首先选择数据库,然后再使用这个SQL语句
  2. 只需修改 id(唯一标识) , 表名 ,字段1,字段2,当然,如果有更多可能重复的字段,可以继续加 字段3 字段4 字段N 。

解释:

首先,确认能够查询到重复的数据项:

id字段1字段2
1xxxxxx
2xxxxxx
select * from 表名
where (表名.字段1,表名.字段2) 
in(select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*) > 1)
and id not in (select min(id) from 表名 group by 字段1,字段2 having count(*)>1)

替换上面的sql语句的 ‘表名’ , ‘字段1’ , ‘字段2’ , ‘id’ 运行后即可返回想要删除的记录

如果按照传统(或网上大多数复制粘贴的答案),会这样进行数据的删除(2,3,4行没变,就改了第一行):

delete from 表名
where (表名.字段1,表名.字段2) 
in(select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*) > 1)
and id not in (select min(id) from 表名 group by 字段1,字段2 having count(*)>1)

注意:

  1. 在mysql workbench里面出现的这类型报错是不会提示的,左下角直接就是 query interrupt ,想要知道报错原因,可以用命令行方式登录mysql
  2. 这样的SQL其实并没有错,如果在sql server或是oracle里是可以成功执行的,但是在mysql中是不允许的,原因不详

确认可以通过查询来找到重复的数据(这里重复的数据只保留一条,且这一条是id最小的)后,可以使用这样的方法:

delete from 表名 where id 
in (select id from (
    select id from 表名
    where (表名.字段1,表名.字段2) 
    in (select 字段1,字段2 from 表名 group by 字段1,字段2 having count(*) > 1)
    and id not in (select min(id)  from 表名 group by 字段1,字段2 having count(*)>1) 
)as temp );

这里缩进的部分与上面查询的代码大致相同,可以复制粘贴后将 * 改为 id。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呆萌的代Ma

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值