MySql删除重复数据(只保留一条)
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删除重复数据(只保留一条)相关推荐
- mysql删除重复数据只保留一条_mysql查找删除重复数据并只保留一条实例详解
有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...
- mysql 删除重复数据只保留一条记录
删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...
- Mysql删除重复数据只保留一条
(1)以这张表为例: CREATE TABLE `test` (`id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ...
- mysql删除重复数据只保留一条_【SQL】mysql删除重复数据只保留一条
清洗数据的时候,发现有重复数据. 之前多用EXCEL处理数据,一键就可以delete了.这次因为数据量相对较大换了mysql. 按照百度搜到的一个高票代码,运行了半天都不对. 一直报错: 即按照mys ...
- sql 删除重复数据 只保留一条
oracle 删除重复数据 只保留一条 DELETE from t_ows_compelete_rfc WHERE operation_no is null IN ( SELECT operation ...
- mysql 删除重复数据 保留一个_MySQL学习笔记-删除重复数据只保留一条
有这样一张表,表数据及结果如下: 可以看出,school_name的字段值有重复数据(Abraham Lincoln High School 和Agoura High School分别出现两次),那么 ...
- MySQL删除重复数据只保留最新的一条
MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...
- MySQL 中删除重复数据只保留一条
WechatIMG256.jpeg 场景 在许多条记录里,存在着些相同的记录,使用SQL语句,删除掉重复项只保留一条. 数据模型 half_demon 半妖表 id name weapon skill ...
- MySQL中删除重复数据只保留一条
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT ...
最新文章
- pythonmysql数据库系统实战_Python实战之MySQL数据库操作
- mysql-proxy 0.8.5_主从读写分离----mysql-proxy0.8.5安装与配置
- Windows Mobile 开发系列文章收藏 - 讨论篇
- 财务思维02-资产边界
- #1176 : 欧拉路·一(欧拉通路的判定)
- 问题 E: 序列操作Ⅰ(01背包)
- swing和MySQL登录注册_JavaSwing+Mysql实现简单的登录界面+用户是否存在验证
- 【渝粤题库】广东开放大学 信息安全数学基础 形成性考核 (2)
- gradle命令无法识别
- java提交按钮_java – 允许“Enter”键按提交按钮,而不是仅使用MouseClick
- UIView延迟效果做出动画/UIView动画块
- 2021华为软挑赛题_思路分析——实时更新,做多少更多少(一)
- 【游戏开发实战】Unity调用谷歌Google免费翻译API(https接口),年轻人不讲武德,用多个国家语言怎么讲
- 为什么程序员从来不炫富?
- 手机远程连接linux软件下载,远程连接linux服务器软件下载
- 基于verilog状态机的八层电梯实现
- 未来影像!华为P30国行版售价曝光:徕卡四摄+超级变焦,3988元起
- 三种Lp范数距离定义
- Win7系统不同程序无法同时播放声音是怎么回事?
- 微信小程序routeDone错误问题