用户名:
密 码: 记住
您当前的位置:首页 > 网络编程 > mysql教程

mysql删除重复记录sql语句

时间:2015-01-23  来源:西部数据  作者:西部数据

我们经常会碰到需要删除数据表中重复记录,下面我来总结了几种能删除重复记录并助相对来讲效率是非常不错的,有需要了解的朋友可进入参考.

创建一个表用来存放,要删除的记录的id信息,代码如下:

  1. CREATE TABLE `tmp_ids` (  
  2.   `id` int(11),  
  3.   `namechar(20)    
  4. ) ENGINE=MyISAM; 

如果要删除的记录不多的话,可以把这个表创建成内存表形式,代码如下:

  1. CREATE TABLE `tmp_ids` (  
  2.   `id` int(11),  
  3.   `namechar(20)   
  4. ) ENGINE=HEAP; 

然后在test表中删除重复记录,代码如下:

  1. insert into tmp_ids select min(id),name from test group by name having count(*)>1 order by null;  
  2. delete a.* from test a,tmp_ids b where b.name=a.name and a.id>b.id;  
  3. truncate table tmp_ids; 

方法二,复制无重复记录到新表格,删除旧表格,然后重命名新表格为旧表名称,代码如下 :

  1. mysql> select * from duplicate where id in(select min(id) from duplicate group by name); 
  2. +----+-------+ 
  3. | id | name  | 
  4. +----+-------+ 
  5. |  1 | wang  |  
  6. |  3 | wdang |  
  7. |  5 | wdand |  
  8. |  6 | wddda |  
  9. +----+-------+ 
  10. rows in set (0.01 sec) 
  11. mysql> create table duplica select * from duplicate where id in(select min(id) from duplicate group by name); 
  12. Query OK, 4 rows affected (0.02 sec) 
  13. Records: 4  Duplicates: 0  Warnings: 0 
  14. mysql> drop table duplicate; 
  15. Query OK, 0 rows affected (0.01 sec) 
  16. mysql> alter table duplica rename to duplicate; 
  17. Query OK, 0 rows affected (0.00 sec) 
  18. mysql> select * from duplicate; 
  19. +----+-------+ 
  20. | id | name  | 
  21. +----+-------+ 
  22. |  1 | wang  |  
  23. |  3 | wdang |  
  24. |  5 | wdand |  
  25. |  6 | wddda |  
  26. +----+-------+ 
  27. rows in set (0.00 sec) 
  28. --phpfensi.com 
  29. mysql> alter table duplicate modify id int(2) not null primary key auto_increment; 
  30. Query OK, 4 rows affected (0.00 sec) 
  31. Records: 4  Duplicates: 0  Warnings: 0 

后来想了一个语句搞定了,代码如下:

  1. mysql> use mysql 
  2. Database changed 
  3. mysql> select * from duplicate; 
  4. +----+-------+ 
  5. | id | name  | 
  6. +----+-------+ 
  7. |  1 | wang  |  
  8. |  3 | wdang |  
  9. |  5 | wdand |  
  10. |  6 | wddda |  
  11. |  2 | wang  |  
  12. |  4 | wdang |  
  13. +----+-------+ 
  14. rows in set (0.00 sec) 
  15. mysql> delete duplicate as a from duplicate as a, 
  16.     -> ( 
  17.     -> select * from duplicate group by name having count(1)>1) as b 
  18.     -> where a.name=b.name and a.id > b.id; 
  19. Query OK, 2 rows affected (0.00 sec) 
  20. mysql> select * from duplicate; 
  21. +----+-------+ 
  22. | id | name  | 
  23. +----+-------+ 
  24. |  1 | wang  |  
  25. |  3 | wdang |  
  26. |  5 | wdand |  
  27. |  6 | wddda |  
  28. +----+-------+ 
  29. rows in set (0.00 sec) 

保留ID最小的记录.

第1种,代码如下:

  1. delete from %s where goodsurl in (select goodsrul as gurl1 from %s 
  2.          #group by grul1 having count(gurl1)>1)rs1 and id not in (select min(id)as id2 from %s 
  3.           #group by goodsurl having count(goodsurl)>1)rs2"%(a,a,a) 

第2种,这种方法不使用子集,但是我不知道怎么把rs1,rs2里面的元组嵌入到SQL语句中,代码如下:

  1. exeSql = "select min(id) from %s group by goodsurl havingcount(goodsurl)>1)"%(a,) --phpfensi.com 
  2. cur.execute(exeSql) 
  3. rs1 = cur.fetchall() 
  4. exeSql = "select goodsurl from %s group by goodsurl havingcount(goodsurl)>1"%(a,) 
  5. cur.execute(exeSql) 
  6. rs2 = cur.fetchall() 
  7. exeSql = "delete from %s where goodsurl in %s and id not in %"%(a,rs2,rs1) 
  8. cur.execute(exeSql)
来顶一下
返回首页
返回首页
推荐资讯
WiFi太不安全:7岁女孩11分钟内入侵公共网络 WiFi太不安全:7岁女孩11分钟内入侵近期刚刚发布研究说WiFi网络能获得人们手机里多少私人信息,
不服跑个分?人工智能也出现“刷分”乱象 不服跑个分?人工智能也出现“刷分2014年,人工智能领域突然爆发,成为了科研和科技创业的热门
相关文章
    无相关信息
栏目更新
栏目热门