MySQL несколько уникальных столбцов - PullRequest
0 голосов
/ 22 февраля 2019

Итак, у меня есть существующая таблица пользователей MySQL с тысячами записей в ней.Я заметил дубликаты записей для пользователей, что является проблемой, которую мне нужно решить.Я знаю, что мне нужно как-то сделать 2 столбца уникальными.

Дубликаты возникают с записями, содержащими как один и тот же столбец server_id , так и один и тот же user_id столбец.Эти 2 столбца предназначены для уникальной комбинации.Так что должно быть только 1 user_id на server_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 голосов
/ 22 февраля 2019

В вашей таблице должен существовать столбец первичного ключа, такой как 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);
0 голосов
/ 22 февраля 2019

Вы хотите предотвратить это, добавив уникальный индекс:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...