删除数据表中重复记录
删除数据表中重复记录
Pet表结构及数据如下(要求删除字段"petName"相同的记录,保留最新一条即可):
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
| 4 | DODO | cat |
| 5 | WQWQ | cat |
| 6 | MOMO | cat |
+----+---------+---------+
6 rows in set
删除后结果:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
1、not in方式
Delete from t_pet where id not in( select id from t_pet group by petName );
保留重复记录的最后(最新)一条:
Delete from t_pet where id not in( select max(id) from t_pet group by petName );
注:在mysql数据库里上面的方法不可行,会抛出一个1093 - You can't specify target table 't_pet' for update in FROM clause 的错误,(+﹏+)。解决方案之一:我采用的创建临时表的方式,也就是先把查询出来的非重复记录的id放到临时表里,然后再删除,如:
① Drop table if exists temp_pet;
② Create temporary table select max(id) from t_pet group by petName;
③ Delete from t_pet where id not in ( select * from temp_pet );
这里也可以写一个存储过程来实现。
2、Left join 方式
Delete a from t_pet a left join ( select * from t_pet group by petName ) b on a.id = b.id where b.id is null;
以上方式mysql数据库同样有效。
分步骤说明下:
先看left join 查询语句得到的结果是:
+----+---------+---------+------+---------+---------+
| a.id | a.petName | a.petType | b.id | b.petName | b.petType |
+----+---------+---------+------+---------+---------+
| 4 | DODO | cat | NULL | NULL | NULL |
| 5 | WQWQ | cat | NULL | NULL | NULL |
| 6 | MOMO | cat | NULL | NULL | NULL |
+----+---------+---------+------+---------+---------+
至于为啥是这个结果不用我说了吧,以上结果就是重复的记录,可以对照上面的总表比对下!
最后当然就是删除这些记录,因为b.*字段全为null,所以删除a.*字段即可,剩下的就是非重复记录了,如下:
+----+---------+---------+
| id | petName | petType |
+----+---------+---------+
| 1 | DODO | cat |
| 2 | MOMO | cat |
| 3 | WQWQ | cat |
+----+---------+---------+
好了,这里就介绍这两种方法,当然还有很多方法来实现重复记录的删除,有兴趣大家可以网上看看,很多好心人总结了一些不错的方法!
<!--EndFragment-->
<!--EndFragment-->