从表中删除重复项

时间:2013-08-20 14:39:21

标签: mysql sql

我有一个只包含主键列和文本列的表。文本列有重复的值,我希望那些消失。

我尝试了什么

<小时/> 我用Google搜索了一下,很快找到了我认为的答案,就是这样:

ALTER IGNORE TABLE tablename ADD UNIQUE INDEX index_name (column1);

但在尝试执行查询后,我最终得到了MySQL:“#1062 - 重复输入'v&amp; d'用于键'remove_duplicates'”。因此,经过一段时间的努力,我发现它不起作用。

之后我尝试创建一个tmp表并删除旧的表,但我也无法做到。我可能已经弄错了语法:

CREATE table `tmp` like `Tag`

alter table tmp add unique (text)

INSERT IGNORE INTO `tmp` SELECT * FROM `Tag`

RENAME TABLE `Tag` TO `deleteme`
RENAME TABLE `tmp` TO `Tag`

DROP TABLE `deleteme`;



我想要什么

<小时/> 列'text'没有重复值的表。如果有人发现我之前的方法有任何错误,请告诉我,或者如果你认为应该/可以以不同的方式完成,请告诉我!



修改

<小时/> 我忘了提到我在PK上也有关系(是的,我知道非常重要)。有没有办法“保留”与其他表的关系?如果需要,我可以手动更改另一个表中的id,但是改变它的方法也很棒。

2 个答案:

答案 0 :(得分:10)

当您插入表格时,删除重复项:

CREATE table `tmp` like `Tag`

alter table tmp add unique (text)

INSERT INTO `tmp` SELECT min(pk), text FROM `Tag` group by text;

RENAME TABLE `Tag` TO `deleteme`
RENAME TABLE `tmp` TO `Tag`

DROP TABLE `deleteme`;

答案 1 :(得分:0)

这就是我在一张相当大的桌子上做的事情,我假设你有一个列“id”

ALTER TABLE Tag ADD UNIQUE INDEX text_id (text, id);

在column1上创建一个UNIQUE INDEX。 id所以下一个查询应该运行得更快。

然后,如果您想知道表Tag

中有多少重复项
SELECT COUNT(*) as "total" - COUNT(DISTINCT text) as "duplicates text" FROM Tag

要获得第一行UNIQUE,你应该运行(如果FIFO是不重要的)

INSERT INTO `tmp` SELECT MIN(id), text FROM `Tag` GROUP BY text (Gordon Linoff query)

要获得UNIQUE的最后一行,你应该运行(如果LIFO是不重要的)

INSERT INTO `tmp` SELECT MAX(id), text FROM `Tag` GROUP BY text 

因为关闭覆盖索引,如果服务器不需要创建磁盘临时表,副本应该非常快...

RENAME TABLE `Tag` TO `deleteme`
RENAME TABLE `tmp` TO `Tag`

DROP TABLE `deleteme`;