如何删除重复数据(二)

时间: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;

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

整条 SQL 的操作过程如下:

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

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