如何删除重复数据(二)
时间:2022-07-22
本文章向大家介绍如何删除重复数据(二),主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
上一篇我们介绍了在有主键的表中删除重复数据,今天就介绍如何删除没有主键的表的重复数据。
在 Oracle 里面,每个表的记录都有一条对应的内部行 ID,使用内部行 ID 可以达到和使用主键删除重复数据的效果。对于没有内部行 ID 的数据库而言,就得另辟蹊径。
接下来给大家介绍如何在 MySQL 的数据库上删除没有主键的表的重复记录。
先来看数据,有一张表 test,该表有三个字段:name,age,address 。两条记录之间这三个字段的值完全相同就视为重复记录。
name age address ------ ------ ---------abc 16 aaa abc 16 aaa abc 16 aaa abc 17 aaa abcd 20 bbb
使用下面三种方法可以删除重复数据,现在就来看具体的操作方法
1. 添加主键
最简单的方法就是让添加主键,这样我们就可以使用上一篇(如何删除重复数据)介绍的方法删除重复数据了。
2. 借用临时表
添加主键的方法简单粗暴,但这也破坏了表结构,因此在很多时候我们不被许可这么操作。
我们可以建一张新表,把去重之后的数据导入到新表里面,再把旧表删除了,然后将新表重命名成原来的名称。
CREATE TABLE test_new SELECT DISTINCT * FROM test;
DROP TABLE test;
RENAME TABLE test_new TO test;
3. 使用用户变量
使用用户变量可以像行处理一样的操作数据。
SET @num := 0,@name := '',@age := NULL,@address := '' ;
DELETE FROM testWHERE GREATEST(0, @num := IF(name = @name AND age = @age AND address = @address , @num + 1, 0), LEAST(0, LENGTH(@name := name),@age := age,LENGTH(@address := address))) > 0ORDER BY name,age,address;
重点介绍两个函数 GREATEST
和 LEAST
,GREATEST
是对给定的所有参数中挑出最大值;LEAST
则是在给定的所有参数选出最小值,它在 SQL 中的作用是记住所在行的值,以便下一行调取。
整条 SQL 的操作过程如下:
- 先对表中的数据按照 name,age,address 这三个字段排序,保证重复的数据是相邻的;
- 给所有数据行编号,没有出现重复数据的行的编号都为 0;对于有重复记录的数据,先出现的数据的行的编号是 0,后面出现的数据的编号按顺序递增;
- 删掉编号大于 0 的数据。
删除没有主键的重复记录真是让人头疼,所幸我们有办法处理。
- 关于move tablespace的问题总结(r2笔记50天)
- 一些极度危险的linux命令(r2笔记49天)
- 挑战数据结构与算法面试题——80题全解析(一)
- 关于操作失误的数据修复(r2笔记48天)
- 挑战数据结构与算法面试题——80题全解析(三)
- 巧用rowid简化sql查询(r2笔记47天)
- 算法类面试题解析——美团2016校招:棋子翻转
- 算法类面试题解析——美团2016校招:最大差值
- 用Python进行机器学习小案例
- 启用ODM极速调优IO (r2笔记66天)
- 通过addm分析io问题(r2笔记64天)
- python爬虫+R数据可视化 实例
- 梯度下降优化算法综述
- 关于oracle后台启用的schedule job(r2笔记65天)
- 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 数组属性和方法
- 11个技巧让你编写出更好的Python代码
- 芯片探针到基因组区段坐标的映射
- CDH5升级到CDP7.1
- 底层架构真的折磨死个人(急,在线等)
- Python基础语法(五)—常用模块和模块的安装和导入
- Python计算文件或字符串的MD5/SHA
- .NETCore中实现ObjectId反解
- GSE16561数据集的文章图表复现,小众的illumina表达量芯片
- 数据挖掘课程能带给你什么收获
- AkShare-股票数据-龙虎榜-机构席位成交明细
- AkShare-股票数据-龙虎榜-机构席位追踪
- AkShare-股票数据-龙虎榜-营业上榜统计
- AkShare-股票数据-龙虎榜-个股上榜统计
- React中路由的使用
- CyanX 基于ReactHook的状态管理器,遵循函数式编程的理念,极简、可扩展设计哲学上手