删除数据表中重复记录
    删除数据表中重复记录
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-->