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






Вы хотите предотвратить это, добавив уникальный индекс:
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;
да, но это не его вопрос о том, как создать уникальный индекс данных, который уже нарушает ограничение уникальности, поэтому он не может сначала создать этот уникальный ключ.
Я получаю следующую ошибку, когда запускаю ваш код для удаления дубликатов, даже при изменении primary_key на мое поле id: Неизвестный столбец «gu.max_pk» в «где предложение»
В вашей таблице должен существовать столбец первичного ключа, например 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» в «где пункт»
Я должен что-то изменить с этим? Я написал так же, как вы показали, поскольку guild_users — это имя таблицы.
Поскольку проблема частично связана со схемой таблицы, было бы разумно, если бы вы добавили вывод
show create tableк вопросу. Подсказка: посмотрите на составные ключи, ваш основной должен быть с двумя столбцами.