哇,这个问题在纠结了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 );
- 在mysql命令行模式下(不能使用workbench)首先选择数据库,然后再使用这个SQL语句
- 只需修改 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)
注意:
- 在mysql workbench里面出现的这类型报错是不会提示的,左下角直接就是 query interrupt ,想要知道报错原因,可以用命令行方式登录mysql
- 这样的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。