首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何删除重复数据(二)

如何删除重复数据(二)

作者头像
白日梦想家
发布2020-07-18 18:29:48
1.3K0
发布2020-07-18 18:29:48
举报
文章被收录于专栏:SQL实现SQL实现SQL实现

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

在 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;

重点介绍两个函数 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 归档