MySql删除重复数据(只保留一条)

MySql删除重复数据(只保留一条)MySql 删除重复数据 1 问题引入前一段遇到 MySql 数据重复的问题 由于重复向同一张表导入同一批数据 导致前台展示的数据重复 唯一方便快捷的方法莫过于利用 delete 操作删除重复数据 已经封板发布 只保留其中一条数据 但真的是书到用时方恨少 技术也如此 当时只好在网上搜索资源 最终解决了燃眉之急 但是对找到的 delete 语句并不是太理解 后来抽时间自己研究了一下 现在稍微理解了一点 分享给大家 希望对大家有帮助 2 数据准备创建表 CREATETABLEt del repeti

MySql删除重复数据

1. 问题引入

前一段遇到MySql数据重复的问题。由于重复向同一张表导入同一批数据,导致前台展示的数据重复,唯一方便快捷的方法莫过于利用delete操作删除重复数据(已经封板发布),只保留其中一条数据。但真的是书到用时方恨少,技术也如此。当时只好在网上搜索资源,最终解决了燃眉之急。但是对找到的delete语句并不是太理解,后来抽时间自己研究了一下。现在稍微理解了一点,分享给大家,希望对大家有帮助。

2.数据准备

  • 创建表
 CREATE TABLE test_del_repetition( querymonth VARCHAR(6) DEFAULT NULL COMMENT '查询年月', province VARCHAR(15) DEFAULT NULL COMMENT '省份', city VARCHAR(15) DEFAULT NULL COMMENT '城市', population INT(10) DEFAULT 0 COMMENT '人口(万)', KEY pro (province) USING BTREE, KEY cit (city) USING BTREE, KEY pop (population) USING BTREE, KEY synthesis (province,city,population) USING BTREE )ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC; 
  • 插入数据
insert into test_del_repetition values('','河南省','南阳市',1002); insert into test_del_repetition values('','河南省','郑州市',956); insert into test_del_repetition values('','河南省','周口市',880); insert into test_del_repetition values('','河南省','驻马店市',695); insert into test_del_repetition values('','河南省','洛阳市',674); insert into test_del_repetition values('','河南省','信阳市',640); insert into test_del_repetition values('','河南省','新乡市',572); insert into test_del_repetition values('','河南省','安阳市',511); insert into test_del_repetition values('','河南省','濮阳市',361); 

3.delete操作

经过私下测试发现造成重复数据的原因主要有两种,一种是重复导入同一批数据,造成每一条数据都存在重复现象;
另一种情况是数据处理不当,数据中个别几条数据存在重复。

3.1 情况一: 重复导入同一批数据

  • 数据模拟
#第一次插入 insert into test_del_repetition values('','河南省','南阳市',1002); insert into test_del_repetition values('','河南省','郑州市',956); insert into test_del_repetition values('','河南省','周口市',880); insert into test_del_repetition values('','河南省','驻马店市',695); insert into test_del_repetition values('','河南省','洛阳市',674); insert into test_del_repetition values('','河南省','信阳市',640); insert into test_del_repetition values('','河南省','新乡市',572); insert into test_del_repetition values('','河南省','安阳市',511); insert into test_del_repetition values('','河南省','濮阳市',361); #第二次插入 insert into test_del_repetition values('','河南省','南阳市',1002); insert into test_del_repetition values('','河南省','郑州市',956); insert into test_del_repetition values('','河南省','周口市',880); insert into test_del_repetition values('','河南省','驻马店市',695); insert into test_del_repetition values('','河南省','洛阳市',674); insert into test_del_repetition values('','河南省','信阳市',640); insert into test_del_repetition values('','河南省','新乡市',572); insert into test_del_repetition values('','河南省','安阳市',511); insert into test_del_repetition values('','河南省','濮阳市',361); 
  • 删除数据
#假设一批数据本该有m条,重复导入n次,则应该删除m*(n-1)条数据 #或者说不清楚数据本该有多少条,但根据日志得知重复导入了x次,目前总的数据量是y条,则应该删除y*((x-1)/x)条 #测试数据本应该有9条,由于重复操作2次,故应该删除掉重复的9条数据 #1.查出重复数据 select a.province from (select province,count(1) from test_del_repetition group by province having count(1)>1)a; #删除重复的9条数据 delete from test_del_repetition where province in (select a.province from (select province,count(1) from test_del_repetition group by province having count(1)>1)a) limit 9; 

3.2 情况二: 数据处理不当,个别数据重复

  • 数据模拟
insert into test_del_repetition values('','河南省','南阳市',1001); insert into test_del_repetition values('','河南省','南阳市',1002); insert into test_del_repetition values('','河南省','郑州市',955); insert into test_del_repetition values('','河南省','郑州市',956); insert into test_del_repetition values('','河南省','周口市',879); insert into test_del_repetition values('','河南省','周口市',880); insert into test_del_repetition values('','河南省','驻马店市',694); insert into test_del_repetition values('','河南省','驻马店市',695); insert into test_del_repetition values('','河南省','安阳市',510); insert into test_del_repetition values('','河南省','安阳市',511); insert into test_del_repetition values('','河南省','濮阳市',360); insert into test_del_repetition values('','河南省','濮阳市',361); insert into test_del_repetition values('','河南省','濮阳市',361); insert into test_del_repetition values('','河南省','濮阳市',361); 
  • 删除数据
#上面的数据只有濮阳数据存在重复,并且只有月的濮阳数据重复,此时就要找到表的业务主键,根据表结构可以得出业务主键是querymonth和city。 #1.获取重复数据以及数据重复次数,示例数据为 ‘ 濮阳市 3’,也就是重复了3次,则要删除多余的2条数据 select querymonth,city,count(1) from test_del_repetition group by querymonth,city having count(1)>1)a; #2.删除重复数据 delete from test_del_repetition where querymonth='' and city ='濮阳市' limit 2; 

上面这种情况针对重复的数据,不能像第一种那样整批删除。比如说重复数据有:

querymonth city count(1)
濮阳市 3
南阳市 4

濮阳重复三次,南阳重复四次,则要根据业务主键分批删除重复数据。当然这种情况也可能有更简便的方法,但是目前能力有限,希望有经验的大佬可以给出更好的答案。

本次分享到此结束,希望我的分享能给大家带来些许的便利,如果存在错误理解,也希望各位能提出来共同学习。祝大家工作顺利~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215234.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:22
下一篇 2026年3月18日 下午2:23


相关推荐

  • c++多态的案例分析

    c++多态的案例分析

    2021年12月15日
    46
  • midjourney生成室内效果图

    midjourney生成室内效果图

    2026年3月15日
    4
  • windows服务器审计日志存放位置,windows服务器审计日志存放位置[通俗易懂]

    windows服务器审计日志存放位置,windows服务器审计日志存放位置[通俗易懂]windows服务器审计日志存放位置内容精选换一换Manager的审计日志默认保存在数据库中,如果长期保留可能引起数据目录的磁盘空间不足问题,管理员如果需要将审计日志保存到其他归档服务器,可以在FusionInsightManager设置转储参数及时自动转储,便于管理审计日志信息。若用户未配置审计日志转储,当审计日志达到十万条,系统自动将这十万条审计日志保存到文件中。保存路径为主管理节为加强对…

    2022年6月4日
    179
  • no input file specified 三种解决方法

    no input file specified 三种解决方法一.IIS Noinputfilespecified方法一:改PHP.ini中的doc_root行,打开ini文件注释掉此行,然后重启IIS方法二:请修改php.ini找到;cgi.force_redirect=1去掉前面分号,把后面的1改为0即cgi.force_redirect=0二.apache Noinputfilespecifi…

    2022年7月25日
    16
  • 苹果2021尺寸(生肖年份对照表2020)

    iPhone11 6.1英寸 iPhone11Pro 5.8英寸 iphone手机爆降价1500这活动太给力了机会不容错过http://iphone.adiannao.cn/2iPhone11ProMax 6.5英寸iPhoneSE2020款 4.7英寸 iPhone12mini 5.4英寸 iPhone12 6.1英寸 iPhone12Pro 6.1英寸 iPhone12ProMax 6.7英寸第一代iPhone2GiOS1

    2022年4月11日
    163
  • Linux lsusb命令

    Linux lsusb命令在 Linux 中我们可以使用 lsusb 来列出 USB 设备和它的属性 lsusb 会显示驱动和内部连接到你系统的设备 直接在控制台输入 lsusb 即可 lsusbBus002D ID05e3 0612GenesysL Inc Bus002Device ID1d6b 0003LinuxFou 0ro

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号