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('202107','河南省','南阳市',1002);
insert into test_del_repetition values('202107','河南省','郑州市',956);
insert into test_del_repetition values('202107','河南省','周口市',880);
insert into test_del_repetition values('202107','河南省','驻马店市',695);
insert into test_del_repetition values('202107','河南省','洛阳市',674);
insert into test_del_repetition values('202107','河南省','信阳市',640);
insert into test_del_repetition values('202107','河南省','新乡市',572);
insert into test_del_repetition values('202107','河南省','安阳市',511);
insert into test_del_repetition values('202107','河南省','濮阳市',361);

3.delete操作

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

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

  • 数据模拟
#第一次插入
insert into test_del_repetition values('202107','河南省','南阳市',1002);
insert into test_del_repetition values('202107','河南省','郑州市',956);
insert into test_del_repetition values('202107','河南省','周口市',880);
insert into test_del_repetition values('202107','河南省','驻马店市',695);
insert into test_del_repetition values('202107','河南省','洛阳市',674);
insert into test_del_repetition values('202107','河南省','信阳市',640);
insert into test_del_repetition values('202107','河南省','新乡市',572);
insert into test_del_repetition values('202107','河南省','安阳市',511);
insert into test_del_repetition values('202107','河南省','濮阳市',361);
#第二次插入
insert into test_del_repetition values('202107','河南省','南阳市',1002);
insert into test_del_repetition values('202107','河南省','郑州市',956);
insert into test_del_repetition values('202107','河南省','周口市',880);
insert into test_del_repetition values('202107','河南省','驻马店市',695);
insert into test_del_repetition values('202107','河南省','洛阳市',674);
insert into test_del_repetition values('202107','河南省','信阳市',640);
insert into test_del_repetition values('202107','河南省','新乡市',572);
insert into test_del_repetition values('202107','河南省','安阳市',511);
insert into test_del_repetition values('202107','河南省','濮阳市',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;

以上这种情况只适用于同一批数据重复导入多次,此时不需要考虑主键的问题,任意一个字段都可以作为上述的条件字段,进行数据删除。
limit后面跟的就是需要删除数据的条数,也即m*(n-1)或者y*((x-1)/x)

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

  • 数据模拟
insert into test_del_repetition values('202106','河南省','南阳市',1001);
insert into test_del_repetition values('202107','河南省','南阳市',1002);
insert into test_del_repetition values('202106','河南省','郑州市',955);
insert into test_del_repetition values('202107','河南省','郑州市',956);
insert into test_del_repetition values('202106','河南省','周口市',879);
insert into test_del_repetition values('202107','河南省','周口市',880);
insert into test_del_repetition values('202106','河南省','驻马店市',694);
insert into test_del_repetition values('202107','河南省','驻马店市',695);
insert into test_del_repetition values('202106','河南省','安阳市',510);
insert into test_del_repetition values('202107','河南省','安阳市',511);
insert into test_del_repetition values('202106','河南省','濮阳市',360);
insert into test_del_repetition values('202107','河南省','濮阳市',361);
insert into test_del_repetition values('202107','河南省','濮阳市',361);
insert into test_del_repetition values('202107','河南省','濮阳市',361);
  • 删除数据
#上面的数据只有濮阳数据存在重复,并且只有202107月的濮阳数据重复,此时就要找到表的业务主键,根据表结构可以得出业务主键是querymonth和city。#1.获取重复数据以及数据重复次数,示例数据为 ‘202107 濮阳市 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='202107' and city ='濮阳市' limit 2;

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

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

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

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

MySql删除重复数据(只保留一条)相关推荐

  1. mysql删除重复数据只保留一条_mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  2. mysql 删除重复数据只保留一条记录

    删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...

  3. Mysql删除重复数据只保留一条

    (1)以这张表为例: CREATE TABLE `test` (`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ...

  4. mysql删除重复数据只保留一条_【SQL】mysql删除重复数据只保留一条

    清洗数据的时候,发现有重复数据. 之前多用EXCEL处理数据,一键就可以delete了.这次因为数据量相对较大换了mysql. 按照百度搜到的一个高票代码,运行了半天都不对. 一直报错: 即按照mys ...

  5. sql 删除重复数据 只保留一条

    oracle 删除重复数据 只保留一条 DELETE from t_ows_compelete_rfc WHERE operation_no is null IN ( SELECT operation ...

  6. mysql 删除重复数据 保留一个_MySQL学习笔记-删除重复数据只保留一条

    有这样一张表,表数据及结果如下: 可以看出,school_name的字段值有重复数据(Abraham Lincoln High School 和Agoura High School分别出现两次),那么 ...

  7. MySQL删除重复数据只保留最新的一条

    MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...

  8. MySQL 中删除重复数据只保留一条

    WechatIMG256.jpeg 场景 在许多条记录里,存在着些相同的记录,使用SQL语句,删除掉重复项只保留一条. 数据模型 half_demon 半妖表 id name weapon skill ...

  9. MySQL中删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT ...

最新文章

  1. pythonmysql数据库系统实战_Python实战之MySQL数据库操作
  2. mysql-proxy 0.8.5_主从读写分离----mysql-proxy0.8.5安装与配置
  3. Windows Mobile 开发系列文章收藏 - 讨论篇
  4. 财务思维02-资产边界
  5. #1176 : 欧拉路·一(欧拉通路的判定)
  6. 问题 E: 序列操作Ⅰ(01背包)
  7. swing和MySQL登录注册_JavaSwing+Mysql实现简单的登录界面+用户是否存在验证
  8. 【渝粤题库】广东开放大学 信息安全数学基础 形成性考核 (2)
  9. gradle命令无法识别
  10. java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
  11. UIView延迟效果做出动画/UIView动画块
  12. 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
  13. 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲
  14. 为什么程序员从来不炫富?
  15. 手机远程连接linux软件下载,远程连接linux服务器软件下载
  16. 基于verilog状态机的八层电梯实现
  17. 未来影像!华为P30国行版售价曝光:徕卡四摄+超级变焦,3988元起
  18. 三种Lp范数距离定义
  19. Win7系统不同程序无法同时播放声音是怎么回事?
  20. 微信小程序routeDone错误问题

热门文章

  1. 百度宣布搜索公司总裁向海龙离职 沈抖晋升为高级副总裁
  2. 端口映射指导 ----- 配置文件方式
  3. CSS3 自学笔记(二)
  4. 微信小程序和微信公众号的区别和优势
  5. 计算机同一优盘记录,U盘使用后残留在电脑上的记录清理方法
  6. 《linux就该这么学——笔记》第7章 使用RAID与LVM磁盘阵列技术
  7. Ubuntu 20.04 搭建 PXE/iPXE Server
  8. 设计心理学之席克定律和面部辨识
  9. 30行代码就可以实现看图识字!python使用tensorflow.keras搭建简单神经网络
  10. Unity 动画驱动位移的动画fbx导入设置