循序渐进,逐步开始
先展示下示例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 | delete from user where id not in ( |
思路:
- 按重复字段进行分组,查询出每组最小的id。(语句实例第三行)
- 把它作为一个临时表进行查询出id。(语句实例第二行)
- 查询全表把id不在上面两部查询出来的id删掉。(语句实例第一行)