Несколько уникальных столбцов MySQL

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

Дубликаты возникают с записями, содержащими как один и тот же столбец server_id, так и один и тот же столбец Идентификатор пользователя. Эти 2 столбца должны быть уникальными в сочетании. Таким образом, должен быть только 1 Идентификатор пользователя на 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: Как лучше всего избежать создания дубликатов? Должен ли я создать уникальное ограничение для обоих столбцов или вместо этого сделать что-то с первичными ключами?

Поскольку проблема частично связана со схемой таблицы, было бы разумно, если бы вы добавили вывод show create table к вопросу. Подсказка: посмотрите на составные ключи, ваш основной должен быть с двумя столбцами.

marekful 22.02.2019 12:37

Я советую вам прочитать Почему я должен предоставлять MCVE для того, что мне кажется очень простым SQL-запросом? и предоставить примеры данных и ожидаемые результаты. Таким образом, мы укажем, какую запись вы хотите сохранить от всех дубликатов.

Raymond Nijland 22.02.2019 12:54
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
2
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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;

да, но это не его вопрос о том, как создать уникальный индекс данных, который уже нарушает ограничение уникальности, поэтому он не может сначала создать этот уникальный ключ.

Raymond Nijland 22.02.2019 12:51

Я получаю следующую ошибку, когда запускаю ваш код для удаления дубликатов, даже при изменении primary_key на мое поле id: Неизвестный столбец «gu.max_pk» в «где предложение»

Luke 22.02.2019 15:03
Ответ принят как подходящий

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

После этого вы можете создать уникальное ограничение для двух столбцов:

alter table guild_users 
add constraint un_server_user unique 
(server_id, user_id);

Я получаю эту ошибку при запуске вашего первого фрагмента кода: Неизвестный столбец «gu.server_id» в «где пункт»

Luke 22.02.2019 15:01

Я должен что-то изменить с этим? Я написал так же, как вы показали, поскольку guild_users — это имя таблицы.

Luke 22.02.2019 15:04

Другие вопросы по теме