MySQL多个唯一列

时间:2019-02-22 11:32:43

标签: mysql sql

所以我有一个现有的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::避免创建重复项的最佳方法是什么?我应该为这两列创建一个唯一约束,还是用主键做什么?

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);