删除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 PHP语法浅析

    MySQL PHP语法浅析

    在本篇文章里小编给大家分享了关于MySQL PHP语法的相关知识点,需要的朋友们学习参考下。
    2019-02-02
  • MySQL 5.7 版本的安装及简单使用(图文教程)

    MySQL 5.7 版本的安装及简单使用(图文教程)

    这篇文章主要介绍了MySQL 5.7 版本的安装及简单使用(图文教程)的相关资料,这里对mysql 5.7的安装及使用和注意事项,需要的朋友可以参考下
    2016-12-12
  • MySQL初始密码的查看方式

    MySQL初始密码的查看方式

    这篇文章主要介绍了MySQL初始密码的查看方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • Mysql varchar大小长度问题介绍

    Mysql varchar大小长度问题介绍

    如果被 varchar 超过上述的 b 规则,被强转成 text 类型,则每个字段占用定义长度为 11 字节,当然这已经不是 varchar 了
    2011-10-10
  • MySQL8.0窗口函数入门实践及总结

    MySQL8.0窗口函数入门实践及总结

    这篇文章主要给大家介绍了关于MySQL8.0窗口函数入门实践及总结的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用MySQL8.0具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-06-06
  • SQL Server服务器监控

    SQL Server服务器监控

    这篇文章主要介绍了SQL Server服务器监控,SQL server监控是收集、聚合和监控SQL服务器的各种指标的过程,更多相关内容需要的朋友可以参考一下
    2022-09-09
  • MySQL嵌套查询实例详解

    MySQL嵌套查询实例详解

    这篇文章主要介绍了MySQL嵌套查询的使用技巧,结合实例形式较为详细的分析了MySQL嵌套查询参数设置、使用方法与注意事项,需要的朋友可以参考下
    2015-12-12
  • Windows 下noinstall方式安装 mysql 5.7.5 m15 winx64(推荐)

    Windows 下noinstall方式安装 mysql 5.7.5 m15 winx64(推荐)

    这篇文章主要介绍了Windows 下noinstall方式安装 mysql-5.7.5-m15-winx64的相关资料,非常不错,具有参考借鉴价值,感兴趣的朋友一起看看吧
    2016-09-09
  • MAC下Mysql5.7+ MySQL Workbench安装配置方法图文教程

    MAC下Mysql5.7+ MySQL Workbench安装配置方法图文教程

    这篇文章主要为大家详细介绍了MAC下Mysql5.7+ MySQL Workbench安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-06-06
  • mysql 5.7.27 winx64安装配置方法图文教程

    mysql 5.7.27 winx64安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 5.7.27 winx64安装配置方法图文教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10

最新评论