上一篇我们介绍了在有主键的表中删除重复数据,今天就介绍如何删除没有主键的表的重复数据。
在 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
使用下面三种方法可以删除重复数据,现在就来看具体的操作方法
最简单的方法就是让添加主键,这样我们就可以使用上一篇(如何删除重复数据)介绍的方法删除重复数据了。
添加主键的方法简单粗暴,但这也破坏了表结构,因此在很多时候我们不被许可这么操作。
我们可以建一张新表,把去重之后的数据导入到新表里面,再把旧表删除了,然后将新表重命名成原来的名称。
CREATE TABLE test_new SELECT DISTINCT * FROM test;
DROP TABLE test;
RENAME TABLE test_new TO test;
使用用户变量可以像行处理一样的操作数据。
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 的操作过程如下:
删除没有主键的重复记录真是让人头疼,所幸我们有办法处理。