删除MySQL表中的重复数据?
2023-06-13 09:15:24 时间
前言
一般我们将数据存储在MySQL数据库中,它允许我们存储重复的数据。但是往往重复的数据是作废的、没有用的数据,那么通常我们会使用数据库的唯一索引 unique
键作为限制。问题来了啊,我还没有创建唯一索引捏,数据就重复了(我就是忘了,怎么滴)。
那么如何在一个普通的数据库表中删除重复的数据呢?
那我用一个例子演示一下如何操作。。。
示例
创建示例数据表
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='对比结果'
创建示例数据
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
去重重复的数据,思路:
- 筛选出有重复的业务主键
iccId
- 查询出 1. 中最小的自增主键
id
- 令要删除的数据
iccId
控制在 1. 和 不等于 2.中 - 同时删除空的业务主键数据
那么便有以下几个查询:
/*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做删除的时候会提示不能用查询的结果来做删除操作,这个时候就需要将查询的数据作为一个临时表,起别名进行删除啦。那么会变成这样:
成品
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
尾言
然后在这里再给数据库的主键设置唯一索引啦!
行啦,先这样吧。
相关文章
- MySQL如何删除临时表(mysql删除临时表)
- 的数据MySQL查询:跨表拉取数据(mysql查询两张表)
- MySQL搜索:快速获取表内容(mysql搜索表)
- MySQL数据导入失败:排查问题指南(mysql导入失败)
- MySQL数据读取速度缓慢的原因及解决方法(mysql读取数据慢)
- MySQL 实例的详解及使用方法(mysql实例)
- MySQL数据库备份与恢复的完美指南(mysql备份和还原)
- MySQL如何有效防止SQL注入攻击?(mysql防sql注入)
- MySQL索引优化,提升数据库性能(mysql索引与优化)
- 如何使用MySQL查询所有列名(mysql查询所有列名)
- MySQL:如何列出所有表名(mysql列出表名)
- CSV格式数据简单导入MySQL数据库的方法(csv 导入 mysql)
- MySQL数据导入遭遇乱码困扰(mysql数据导入乱码)
- MySQL千万级数据快速分页处理技术研究(mysql千万级数据分页)
- MySQL中使用Map作为参数的实现方法(mysql中map做参数)
- Mysql实现两表连接,利用ID匹配数据(mysql两表连接id)
- 如何在MySQL中创建表及列的详细教程(mysql中创建表 列)
- MySQL如何实现分组取前三数据(mysql中分组取前三)
- MySQL三表联查跨表查询数据技巧详解(mysql 三个表联查)
- 如何进行MySQL全量备份,确保系统数据不停库(mysql不停库全量备份)
- MySQL实现上亿条数据高效统计(mysql上亿数据统计)
- MySQL为什么不能以0开头(mysql不能以0开头吗)