MYSQL 删除表中的重复数据

MYSQL 专栏收录该内容
31 篇文章 0 订阅

test表中的原始数据:

        

test表中name字段信息有重复,想进行过滤删除重复数据

删除重复数据之后的预期结果(不考虑id):

          

方法一:

用 create ......select......group by ......

先创建临时表tab,新表tab中的数据时从test表中分组查询出来的

create table  tab select name ,code from test group by name

拷贝原test的表结构为新表test1。然后删除原表test。

drop table test

然后查看tab表:

       

此时tab表中的信息已经删除了重复信息(只考虑name字段的重复性)

但是你会发现tab表中没有id,我们需要加上id,所以就将tab表中的数据插入test1中。

用 insert into ......select ......的方法

执行:insert into test1 select null,name,code from tab;

执行后查看test1表中的信息:

     

达到去删除重复数据的效果。

最后将表test1改名为test就可以了

alter table test1 rename to test   

备注:insert into test1 select null,name,code from tab;

         利用mysql主键自增的特性,所以后面的select语句给id赋值为null即可。

方法二:

删除重复数据,保留重复数据中最小id所在行的数据

delete from  test

where

name in (select pname from (select name as pname from test group by name having count(name) > 1) a)

and

id not in (select pid from (select min(id) as pid from test group by name having count(name) > 1 ) b)

注意where 后面的两个条件:

前者是查询name字段有重复值 且count >1的name值,后者是name字段有重复且count>1数据的最小id

执行上面语句后结果:

     

达到去重的目的,只是id不是连续的。

此方法有一误区,错误sql语句展示如下:

delete from  test

where

name in  (select name as pname from test group by name having count(name) > 1) 

and

id not in (select min(id) as pid from test group by name having count(name) > 1 ) 

以上sql语句看似正确,执行后报错。

错误信息:[Err] 1093 - You can't specify target table 'test' for update in FROM clause

 

 

  • 7
    点赞
  • 4
    评论
  • 21
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

♛薄情痞子♛

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值