Дубликаты в базе mysql при двойном клике
Итак, коротко о проблеме: На сайте есть кнопка спасибо под каждым постом и время от времени в базе появляются две "спасибы" к одному посту от одного пользователя. Я так понимаю это происходит при быстром двойном клике...
Как вижу решение:
добавить составной уникальный ключ
ALTER TABLE
karmaADD UNIQUEuser_post(user_id,post_id) ;Лочить таблицу на время запроса
LOCK TABLES karma WRITE; ... UNLOCK TABLES;
Сделать таймаут перед запросом
usleep(250000);
Пока установил костыль из 3 варианта.
Второй вариант не стал использовать, т.к. не совсем понятна команда UNLOCK TABLES она разблокирует все таблицы что были залочены ранее(например кроном)? или те что залочены в данном скрипте?
Интересует первый вариант. Как установить уникальную ключ-пару если в базе уже есть дубли?
Ответы (1 шт):
Первый вариант самый адекватный разумеется.
И так, запрос для добавления индекса у вас уже есть, в таком случае, вам нужно оставить по одной такой записи в таблице на каждого user-a и post соответственно.
Запрос для удаления дублей:
CREATE TEMPORARY TABLE temp_karma as (
SELECT min(id) FROM karma GROUP BY user_id, post_id
);
DELETE FROM karma WHERE karma.id NOT IN (
SELECT id FROM temp_karma
);
Это оставит по одной, уникальной записи для ключа (user_id, post_id) в вашей таблице karma.