MySQL - 重复数据清理

事情:在按内容类型推荐功能上出现重复的数据

需求:找出重复数据并删除

难点:因两条数据一模一样,没有可区分的标识

思路:需要有一个可区分的标识,然后找出重复数据,并根据这个标识的不同来删除。

反思:为什么会存在重复的数据

      1: 应用层没有做校验,如数据已存在时要做的是update

      2: 数据库层没有做保障,如没有设置主键

具体步骤:

  1. 创建一张临时表
CREATE  TABLE IF NOT EXISTS EPG_CONTENT_BACK (LIKE EPG_CONTENT);
  1. 可临时表加个ID
alter table EPG_CONTENT_BACK add id int
  1. 给ID 设置成主键
alter table `EPG_CONTENT_BACK` change id id int not null auto_increment primary key;
  1. 获取所有字段
desc EPG_CONTENT
  1. 将原表数据复制到 临时表
insert into EPG_CONTENT_BACK(CONTENT_ID,CONTENT_CODE) select CONTENT_ID,CONTENT_CODE from EPG_CONTENT;  
  1. 找到重复的数据,验证是否正确
select id,CONTENT_ID from EPG_CONTENT_BACK group by CONTENT_ID having count(*)>1 ORDER BY CONTENT_ID DESC;

select * from EPG_CONTENT WHERE CONTENT_ID= ''
  1. 再创建临时表-把ID重复的写入临时表
CREATE TABLE TEMP1 AS select id from EPG_CONTENT_BACK group by CONTENT_ID having count(*)>1 ORDER BY CONTENT_ID DESC;
  1. 根据临时表ID,删除临时数据表 EPG_CONTENT_BACK
DELETE FROM EPG_CONTENT_BACK WHERE ID IN (SELECT ID FROM TEMP1)

DROP TABLE TEMP1;

循环6、7、8步,直到没有重复数据

  1. 将已清理好的数据,复制会员表
DELETE FROM EPG_CONTENT;
insert into EPG_CONTENT(CONTENT_ID,CONTENT_CODE) select CONTENT_ID,CONTENT_CODE,EXTERNAL_CODE from EPG_CONTENT_BACK;  
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,967评论 19 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,170评论 6 13
  • 交子,发行于北宋仁宗天圣元年(1023年)的四川成都。曾作为官方法定的货币流通,称作“官交子”,是中国最早由政府正...
    清语宛如阅读 76评论 0 0
  • 拿到一个变量,除了用isinstance()判断它是否是某种类型的实例外,还有没有别的方法获取到更多的信息呢? 例...
    mingminy阅读 161评论 0 0
  • 我不愿被你知道 山河尽处是生活 鲜花被鲜花照耀 精灵独自在林间采摘松果 山野里墨色恣意 阳光逐渐抿合嘴唇 风皱成一...
    泰闲阅读 517评论 17 20