繁体   English   中英

在SQL表的多个列上查找重复项以创建UNIQUE索引

[英]Find duplicates on multiple columns in a SQL table in order to create UNIQUE index

我在一个名为table的table上创建了一个名为abc的索引,该表具有一个名为idPRIMARY KEY和其他三个NULL INTabc

现在我需要这个索引是唯一的,所以我尝试了:

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
  • abc均为INT且可以为NULL

无需先消除重复项,只需ALTER TABLE使用IGNORE选项即可完成所需的操作;

ALTER IGNORE TABLE table DROP INDEX abc, ADD UNIQUE abc (a, b, c);

要使用进行测试的SQLfiddle

如果未指定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM