Дубликаты в базе mysql при двойном клике

Итак, коротко о проблеме: На сайте есть кнопка спасибо под каждым постом и время от времени в базе появляются две "спасибы" к одному посту от одного пользователя. Я так понимаю это происходит при быстром двойном клике...

Как вижу решение:

  1. добавить составной уникальный ключ

    ALTER TABLE karma ADD UNIQUE user_post (user_id, post_id) ;

  2. Лочить таблицу на время запроса

    LOCK TABLES karma WRITE; ... UNLOCK TABLES;

  3. Сделать таймаут перед запросом

    usleep(250000);

Пока установил костыль из 3 варианта.

Второй вариант не стал использовать, т.к. не совсем понятна команда UNLOCK TABLES она разблокирует все таблицы что были залочены ранее(например кроном)? или те что залочены в данном скрипте?

Интересует первый вариант. Как установить уникальную ключ-пару если в базе уже есть дубли?


Ответы (1 шт):

Автор решения: Borislav

Первый вариант самый адекватный разумеется.

И так, запрос для добавления индекса у вас уже есть, в таком случае, вам нужно оставить по одной такой записи в таблице на каждого 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.

→ Ссылка