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

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/weixin_35757704/article/details/88850849

哇,这个问题在纠结了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
1 xxx xxx
2 xxx xxx
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。

猜你喜欢

转载自blog.csdn.net/weixin_35757704/article/details/88850849