8

我的 MySQL 中有一个重复的表。我尝试删除重复项并保留一个条目。我没有主键

我可以通过以下方式找到重复项:

select user_id, server_id, count(*) as NumDuplicates
from user_server
group by user_id, server_id
having NumDuplicates > 1

但不能删除它们:

ALTER IGNORE TABLE `user_server`  
ADD UNIQUE INDEX (`user_id`, `server_id`);

甚至 SET foreign_key_checks = 0; 不管用。错误代码:1062。密钥“user_id_3”的重复条目“142-20”

MySQL 版本:5.5.18 引擎:InnoDB

还有其他方法吗?

4

3 回答 3

12

那是因为你使用了INNO DB,

一个简单的技巧:

set session old_alter_table=1;
ALTER IGNORE TABLE `user_server`  
ADD UNIQUE INDEX (`user_id`, `server_id`);
set session old_alter_table=0;

这做的工作

于 2017-01-31T17:40:32.980 回答
8

可能最简单的方法是复制表的结构,将唯一索引添加到新表中,然后执行以下操作:

INSERT IGNORE INTO new_table SELECT * FROM old_table

要在不创建临时表的情况下删除重复项(每个除外),您可以这样做:

ALTER TABLE `user_server` ADD `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

DELETE us2 FROM user_server us1
 JOIN user_server us2 USING (user_id, server_id)
 WHERE us1.id < us2.id;

ALTER TABLE `user_server` DROP `id`;
于 2014-12-15T21:01:49.027 回答
4

另一个保留 user_server 上所有索引的解决方案是:

CREATE TABLE new_user_server LIKE user_server;
ALTER TABLE new_user_server ADD UNIQUE INDEX (`user_id`, `server_id`);
INSERT IGNORE INTO new_user_server SELECT * FROM user_server;
DROP TABLE user_server;
RENAME TABLE new_user_server TO user_server;
于 2017-01-28T16:20:07.643 回答