删除MySQL表中重复数据详解

 更新时间:2023年06月15日 17:07:24   作者:我是一颗小虎牙_  
这篇文章主要为大家介绍了删除MySQL表中重复数据详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前言

一般我们将数据存储在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 COALESCE函数使用方法代码案例

    MySql COALESCE函数使用方法代码案例

    这篇文章主要介绍了MySql COALESCE函数使用方法代码案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • mysql启动时出现ERROR 2003 (HY000)问题的解决方法

    mysql启动时出现ERROR 2003 (HY000)问题的解决方法

    这篇文章主要为大家详细介绍了mysql启动时出现ERROR 2003 (HY000问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-03-03
  • Win7、WinXP下MySql安装出错完全卸载的方法步骤

    Win7、WinXP下MySql安装出错完全卸载的方法步骤

    这篇文章主要介绍了Win7、WinXP下MySql安装出错完全卸载的方法步骤,本文给出详细的操作步骤,按本文方法清理后,重新安装,应该就不会有错误了,需要的朋友可以参考下
    2015-06-06
  • 从零开始学习SQL查询语句执行顺序

    从零开始学习SQL查询语句执行顺序

    sql语言中的查询的执行顺序,以前不是很了解,最近查阅了相关资料,在sql语言中,第一个被处理的字句总是from字句,最后执行的limit操作,现在小编来和大家一起学习一下
    2019-05-05
  • MySQL六种约束的示例详解(全网最全)

    MySQL六种约束的示例详解(全网最全)

    约束是作用于表中字段上的规则,用于限制存储在表中的数据。这篇文章主要为大家整理了一下MySQL中六种约束的用法,感兴趣的可以了解一下
    2022-07-07
  • 如何安全地关闭MySQL

    如何安全地关闭MySQL

    这篇文章主要介绍了如何安全地关闭MySQL,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-12-12
  • MySQL多表查询机制

    MySQL多表查询机制

    这篇文章主要介绍了MySQL多表查询机制,多表查询首先离不开等值连接,下文我们从等值连接展开详细内容,具有一定的参考价值需要的小伙伴可以参考一下
    2022-03-03
  • MyBatis动态SQL、模糊查询与结果映射操作过程

    MyBatis动态SQL、模糊查询与结果映射操作过程

    本篇所讲的动态SQL,是mybatis通过标签元素的形式, 如if, choose, when, otherwise, trim, where, set, foreach等标签完成对sql的拼接功能,使用起来也非常灵活方便,这篇文章主要介绍了MyBatis动态SQL、模糊查询与结果映射,需要的朋友可以参考下
    2023-08-08
  • MYSQL 浅谈MyISAM 存储引擎

    MYSQL 浅谈MyISAM 存储引擎

    mysql中用的最多存储引擎就是innodb和myisam。做为Mysql的默认存储引擎,myisam值得我们学习一下,以下是我对《高性能MYSQL》书中提到的myisam的理解,请大家多多指教
    2012-04-04
  • Mysql自带profiling性能分析工具使用分享

    Mysql自带profiling性能分析工具使用分享

    Mysql自带profiling性能分析工具使用分享,需要的朋友可以参考下
    2012-11-11

最新评论