如何删除重复数据
时间:2022-07-22
本文章向大家介绍如何删除重复数据,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
当表设计不规范或者应用程序的校验不够严谨时,就容易导致业务表产生重复数据。因此,学会高效地删除重复就显得尤为重要。
今天我们就来说怎么删除有主键的重复数据。提前预告:下一篇文章会介绍如何删除没有主键的重复数据。
可以只使用单条 SQL 语句删除表中的重复数据,也可以借助于临时表来达到这个目的。使用单条 SQL 语句的 好处是操作原子性的,不需要考虑事务;而借助于中间表的方式则需要分成多条 SQL 语句才能完成删除操作,这个过程需要启用事务来保持数据一致性。
在这里,我们只介绍使用单条语句的操作。操作步骤如下:
- 找出有重复的数据;
- 在重复的数据中标记需要保留的数据;
- 删除重复数据里面没有被标记的数据。
由于主键的存在,可以将重复数据中的对应的主键的最大或最小的那条记录标记为保留数据。
我们来看具体的操作,有一个 emp 表,emp 的表结构如下:
CREATE TABLE `emp` ( `empno` int(11) NOT NULL, `ename` varchar(10) DEFAULT NULL, `job` varchar(9) DEFAULT NULL, `mgr` int(11) DEFAULT NULL, `hiredate` date DEFAULT NULL, `sal` decimal(7,2) DEFAULT NULL, `comm` decimal(7,2) DEFAULT NULL, `deptno` int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8
表中的数据如下图所示(标红的是重复数据):
字段 ename 作为判断重复数据的依据,即两条或者两条以上的数据的 ename 字段的值相同,说明它们都是重复数据。
当存在重复数据时,只需要保留重复数据中 empno 最大的那条记录
方法一:
先通过 group by ... having
找到重复数据中要保留的数据,再通过关联操作删掉未选中的数据。
DELETE a.* FROM emp a INNER JOIN (SELECT ename, MAX(empno) AS empno FROM emp GROUP BY ename HAVING COUNT(*) > 1) b ON b.ename = a.ename AND b.empno <> a.empno ;
方法二:
做自关联,然后删除关联上的数据中 empno 较小的记录。
DELETE a.* FROM emp a INNER JOIN emp b ON b.ename = a.ename AND a.empno < b.empno
如果存在比较多组的重复数据,且每组内的重复数据不是很多,使用方法二就比较高效。
如果重复数据非常少,使用方法二的就有可能出现性能问题,这时就应该选择方法一。
所以,应该先了解数据分布的情况,再选择合适的方法执行删数据操作。
- React第三方组件3(状态管理之Flux的使用③TodoList中)
- Vue实现百度下拉提示搜索一、前期准备二、代码实现三、实现效果
- React第三方组件3(状态管理之Flux的使用②TodoList上)
- ggplot2玫瑰图案例——星巴克门店分布图
- React第三方组件3(状态管理之Flux的使用①简单使用)
- 用ggplot2画了一个我也叫不上名的炫酷图表
- React技巧8(不再手动绑定this,跟.bind(this)说88)
- 美美的商务范儿——ggplot2蝴蝶图
- 机器学习(三)使用Python和R语言从头开始理解和编写神经网络介绍目录神经网络背后的直观知识多层感知器及其基础知识什么是激活函数?前向传播,反向传播和训练次数(epochs)多层感知器全批量梯度下降
- React第三方组件2(状态管理之Refast的使用⑤LogicRender使用)
- 左右用R右手Python9——字符串合并与拆分
- hdu 1003 Max Sum(最大子窜和)
- React第三方组件2(状态管理之Refast的使用④中间件middleware使用)
- 高维分面应用——ggplot2分面气泡图饼图
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux netstat命令结果分析
- setlistmap部分源码解析
- 使用 Log4j2 + SLF4j 打造日志系统的全方位教程
- 树莓派4的操作系统安装烧录、设置SSH、WIFI、VNC及备份
- C# dotnet 使用 startIndex 提升 IndexOf 的性能
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call