mysql删除多余重复数据只保留一条数据

问题的根源都来自现实生活中。
就在周末无聊从网上爬数据插入到数据库时,发现有些数据是重复的,而且重复了五六次。肯定不能忍。于是查询资料,sql骚操作一番,最后完美解决。

循序渐进,逐步开始

先展示下示例user表数据

id username password ctime
1 tom 123456 2019-07-29
2 jack 123456 2019-07-21
3 tom 123456 2019-07-29
4 admin admin 2019-01-01
5 tom 123456 2019-07-29
6 jack 123456 2019-07-21

先把数据进行分组,把有重复数据的组筛选出来

1
select username,count(1) from user GROUP BY username HAVING count(1) > 1
username count(1)
tom 3
jack 2

查询出全部重复数据

1
select * from user where username in (select username from user group by username having count(1)>1 )  order by username
id username password ctime
1 tom 123456 2019-07-29
3 tom 123456 2019-07-29
5 tom 123456 2019-07-29
2 jack 123456 2019-07-21
6 jack 123456 2019-07-21

删除全部重复数据

将上面的查询select改为delete会出现如下错误:[Err] 1093 - You can’t specify target table ‘user’ for update in FROM clause
原因是:更新这个表的同时又查询了这个表,查询这个表的同时又去更新了这个表,可以理解为死锁。mysql不支持这种更新查询同一张表的操作
解决办法:把要更新的几列数据查询出来做为一个第三方表,然后筛选更新。

只保留一条数据删除多余重复数据语句实例

1
2
3
4
delete from user where id not in (
select t.minid from
(select min(id) as minid from user GROUP BY username) t
)

思路:

  1. 按重复字段进行分组,查询出每组最小的id。(语句实例第三行)
  2. 把它作为一个临时表进行查询出id。(语句实例第二行)
  3. 查询全表把id不在上面两部查询出来的id删掉。(语句实例第一行)

-------------本文结束感谢您的阅读-------------
感觉文章不错,就赏个吧!
0%