前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >如何删除重复数据(二)

如何删除重复数据(二)

作者头像
白日梦想家
发布2020-07-18 18:29:48
发布2020-07-18 18:29:48
1.3K00
代码可运行
举报
文章被收录于专栏:SQL实现SQL实现
运行总次数:0
代码可运行

上一篇我们介绍了在有主键的表中删除重复数据,今天就介绍如何删除没有主键的表的重复数据。

在 Oracle 里面,每个表的记录都有一条对应的内部行 ID,使用内部行 ID 可以达到和使用主键删除重复数据的效果。对于没有内部行 ID 的数据库而言,就得另辟蹊径。

接下来给大家介绍如何在 MySQL 的数据库上删除没有主键的表的重复记录。

先来看数据,有一张表 test,该表有三个字段:name,age,address 。两条记录之间这三个字段的值完全相同就视为重复记录。

代码语言:javascript
代码运行次数:0
复制
name       age  address  ------  ------  ---------abc         16  aaa      abc         16  aaa      abc         16  aaa      abc         17  aaa      abcd        20  bbb

使用下面三种方法可以删除重复数据,现在就来看具体的操作方法

1. 添加主键

最简单的方法就是让添加主键,这样我们就可以使用上一篇(如何删除重复数据)介绍的方法删除重复数据了。

2. 借用临时表

添加主键的方法简单粗暴,但这也破坏了表结构,因此在很多时候我们不被许可这么操作。

我们可以建一张新表,把去重之后的数据导入到新表里面,再把旧表删除了,然后将新表重命名成原来的名称。

代码语言:javascript
代码运行次数:0
复制
CREATE TABLE test_new SELECT DISTINCT * FROM test;
DROP TABLE test;
RENAME TABLE test_new TO test;

3. 使用用户变量

使用用户变量可以像行处理一样的操作数据。

代码语言:javascript
代码运行次数:0
复制
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;

重点介绍两个函数 GREATESTLEAST ,GREATEST 是对给定的所有参数中挑出最大值;LEAST 则是在给定的所有参数选出最小值,它在 SQL 中的作用是记住所在行的值,以便下一行调取。

整条 SQL 的操作过程如下:

  1. 先对表中的数据按照 name,age,address 这三个字段排序,保证重复的数据是相邻的;
  2. 给所有数据行编号,没有出现重复数据的行的编号都为 0;对于有重复记录的数据,先出现的数据的行的编号是 0,后面出现的数据的编号按顺序递增;
  3. 删掉编号大于 0 的数据。

删除没有主键的重复记录真是让人头疼,所幸我们有办法处理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 SQL实现 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 添加主键
  • 2. 借用临时表
  • 3. 使用用户变量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档