[英]Find duplicates on multiple columns in a SQL table in order to create UNIQUE index
我在一个名为table的table
上创建了一个名为abc
的索引,该表具有一个名为id
的PRIMARY KEY
和其他三个NULL
INT
列a
, b
和c
。
现在我需要这个索引是唯一的,所以我尝试了:
ALTER TABLE table DROP INDEX abc, ADD UNIQUE abc (a, b, c);
但是我有重复,所以MySQL回答:
#1062 - Duplicate entry '1-2-3' for key 'abc'
我可能有很多重复项,因此我正在寻找一种简单的方法来搜索和销毁所有重复项。 我的第一个猜测是:
SELECT * FROM table GROUP BY abc
但是可悲的是,您似乎无法按索引分组。
有没有一种简单的方法来找到这些重复项,每个重复项保留一行,而删除其他重复项?
编辑:
table
作为一个id
字段,它是一个PRIMARY KEY
a
, b
和c
均为INT
且可以为NULL
无需先消除重复项,只需对ALTER TABLE
使用IGNORE
选项即可完成所需的操作;
ALTER IGNORE TABLE table DROP INDEX abc, ADD UNIQUE abc (a, b, c);
如果未指定IGNORE,则在发生重复键错误时,副本将中止并回滚。 如果指定了IGNORE,则仅一行使用唯一键重复的行。 其他冲突的行将被删除。
...并且始终记得在运行Internet上的随机对象可能破坏性的SQL之前备份数据。
SELECT a,b,c
FROM table
GROUP BY a,b,c
HAVING count(*)>1
试试这个找骗子
Select a, b, c
From table
group By a, b, c
Having Count(*) > 1
如果此表上已经有一个唯一的键列(例如其pkColumn
),则可以执行此操作以删除多余的重复项。
Delete table
From table t
Where pkColumn <>
(Select Min(pkColumn)
From table
where a = t.a
and b = t.b
and c = t.c)
我猜您有几种不在这种情况下的记录。
为了避免丢失数据
CREATE table duplicates SELECT MIN(id) as id, a, b, c, COUNT(1) as nduplicates
FROM yourtable
GROUP BY a,b,c
HAVING COUNT(1)>1;
UPDATE yourtable t, duplicates d
SET t.a='toDelete(or some value that you can easy identify from the rest)'
WHERE d.a=t.a and d.b=t.b and d.c=t.c
and d.id!=t.id;
DELETE FROM yourtable WHERE a='toDelete';
然后删除重复项表。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.