工作中, 我们经常有需要删除一些重复数据的这种需求. 重复数据可能是程序 bug 造成的
好, 让我们看看如何删除这些重复数据
删除重复数据的思路呢, 是这样的, 查看根据这个重复字段分组后的结果有没有大于 1 的情况
如果有大于的 1 的情况呢, 那就说明是有重复数据的!
1) 创建数据库
create database ceshi;
2) 创建表
- CREATE TABLE t1 (
- id int(10) unsigned NOT NULL AUTO_INCREMENT,
- name varchar(20) not null,
- createdAt timestamp NOT NULL DEFAULT current_timestamp(),
- updatedAt timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
- PRIMARY KEY (id)
- ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;
3) 插入数据
insert into t1 values(null,'haha',now(),now()),(null,'haha',now(),now()),(null,'xixi',now(),now()),(null,'heihei',now(),now()),(null,'hoho',now(),now()),(null,'hoho',now(),now()),(null,'sasa',now(),now()),(null,'haha',now(),now()),(null,'sasa',now(),now()),(null,'xixi',now(),now());
4) 查看数据
select * from t1;
5) 根据最小 id, 重复字段 name 分组, 假设我们的需求就是最后要保留第最小 id 的这些数据, 把其它重复的删除
select min(id),name from t1 group by name having count(name)>1 order by id;
6) 使用别名关联一下, 这些数据就是重复的, 最后要删除的
select a.* from t1 a,(select *,min(id) from t1 group by name having count(name)>1)as b where a.name=b.name and a.id>b.id;
7) 记得先备份一下数据
- create table bak_t1_20190621 like t1;
- insert into bak_t1_20190621 select * from t1;
8) 删除数据
delete a from t1 a,(select *,min(id) from t1 group by name having count(name)>1)as b where a.name=b.name and a.id>b.id;
9) 最后检查一下, 确实已经没有重复数据了
来源: http://www.bubuko.com/infodetail-3099243.html