前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >删除MySQL表中的重复数据?

删除MySQL表中的重复数据?

原创
作者头像
青衫染红尘
发布2023-02-28 17:36:36
7.1K0
发布2023-02-28 17:36:36
举报
文章被收录于专栏:Surpass' BlogSurpass' Blog

前言

一般我们将数据存储在MySQL数据库中,它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据,那么通常我们会使用数据库的唯一索引 unique 键作为限制。问题来了啊,我还没有创建唯一索引捏,数据就重复了(我就是忘了,怎么滴)。

那么如何在一个普通的数据库表中删除重复的数据呢?

那我用一个例子演示一下如何操作。。。

示例

创建示例数据表

代码语言:sql
复制
CREATE TABLE `flow_card_renewal_comparing` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `iccId` varchar(32) DEFAULT NULL COMMENT 'ICCID',
  `expireDate` date DEFAULT NULL COMMENT '到期日期',
  `result` int(5) DEFAULT NULL COMMENT '对比结果',
  `createTime` datetime DEFAULT NULL COMMENT '创建时间',
  `createBy` varchar(15) DEFAULT NULL COMMENT '创建人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='对比结果'

创建示例数据

代码语言:sql
复制
INSERT INTO flow_card_renewal_comparing(iccId, expireDate, `result`, createTime, createBy) VALUES 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001330', '2023-02-14', 1, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001334', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001335', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001340', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001341', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001342', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 3, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL), 
('TEST0000111100001343', '2023-02-14', 2, '2023-02-14 15:14:38', NULL); 

创建数据如图

数据示例图
数据示例图

现在,我们要根据主键 iccId 去重重复的数据,思路:

  1. 筛选出有重复的业务主键 iccId
  2. 查询出 1. 中最小的自增主键 id
  3. 令要删除的数据 iccId 控制在 1. 和 不等于 2.中
  4. 同时删除空的业务主键数据

那么便有以下几个查询:

代码语言:sql
复制
/*1、查询表中有重复数据的主键*/
select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1

/*2、查询重复iccid中最小的id号*/
select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1

/*3、要删除的重复数据*/
select
	*
from
	flow_card_renewal_comparing
where
	/*条件为不等于最小id的数据全删除*/
	id not in ( 
		select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1 
	)
	and iccId in (
    /*查询有重复的iccid*/
		select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1 
	)

/*4、再删除为空的数据*/
select
	*
from
	flow_card_renewal_comparing
where
	/*条件为不等于最小id的数据全删除*/
	id not in ( 
		select min(id) from flow_card_renewal_comparing rd2 group by rd2.iccid having count(rd2.iccid)>1 
	)
	and iccId in (
    /*查询有重复的iccid*/
		select rd2.iccId from flow_card_renewal_comparing rd2 GROUP by rd2.iccId having count(rd2.iccId)>1 
	)
	or iccId is null

注意一点是mysql做删除的时候会提示不能用查询的结果来做删除操作,这个时候就需要将查询的数据作为一个临时表,起别名进行删除啦。那么会变成这样:

成品

代码语言:sql
复制
delete
from
	flow_card_renewal_comparing
where
	/*条件为不等于最小id的数据全删除*/
	id not in ( 
		select id from (select min(id) as id from flow_card_renewal_comparing group by iccid having count(iccid)>1) temp1
	)
	and iccId in (
    /*查询有重复的iccid*/
		select iccId from (select iccId from flow_card_renewal_comparing GROUP by iccId having count(iccId)>1 ) as temp2
	)
	or iccId is null

尾言

然后在这里再给数据库的主键设置唯一索引啦!

行啦,先这样吧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 示例
    • 成品
    • 尾言
    相关产品与服务
    对象存储
    对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档