所以我有一个现有的MySQL用户表,其中包含成千上万条记录。我注意到有重复的用户记录,这是我需要解决的问题。我知道我需要做的是以某种方式使2列唯一。
重复记录的记录包含相同的 server_id 列和相同的 user_id 列。这两个列是唯一组合的。因此,每个 server_id 只能有1个 user_id 。
我已经弄清楚了如何使用以下查询找到这些重复项:
SELECT `server_id`, `user_id`, COUNT(*) AS `duplicates` FROM `guild_users` GROUP BY `server_id`, `user_id` HAVING `duplicates` > 1
根据我的阅读,在添加任何约束之前,我需要先删除所有重复项。这是我不确定的事情之一。
问题1:我将如何删除所有重复项,但要保留每个重复项中的1个,以便用户仍然存在,而不会重复其他重复项。
问题2::避免创建重复项的最佳方法是什么?我应该为这两列创建一个唯一约束,还是用主键做什么?
答案 0 :(得分:1)
您想通过添加唯一索引来防止这种情况:
create unique index unq_guild_users_server_user on guild_users(server_id, user_id);
如果有主键,则可以在添加唯一索引之前删除 重复项:
delete g
from guild_users g left join
(select server_id, user_id, max(primary_key) as max_pk
from guild_users
group by server_id, user_id
) su
on gu.primary_key = su.max_pk
where su.max_pk is null;
答案 1 :(得分:1)
表中必须存在一个主键列,例如id
。
因此,您可以使用EXISTS删除重复项并仅保留1:
delete gu from guild_users gu
where exists (
select 1 from guild_users
where
server_id = gu.server_id
and
user_id = gu.user_id
and
id > gu.id
)
之后,您可以为2列创建唯一约束:
alter table guild_users
add constraint un_server_user unique
(server_id, user_id);