MYSQL извлекает, был ли последний запрос обновлением или вставкой
Я работаю над рейтинговой системой в PHP и MYSQL с голосами вверх и голосами вниз.
У меня есть база данных под названием votes
, которая содержит все голоса, поданные зарегистрированными пользователями (1 для голосования "за" и -1 для голосования "против")
Для каждого сообщения, которое может быть оценено, приводится краткое изложение всех голосов "за", "против", а также итогового голосования ("за" минус "против").
Когда кто-то голосует за публикацию, появляется запрос INSERT ... ON DUPLICATE KEY UPDATE
, который вставляет или обновляет таблицу, содержащую все голоса.
Затем я обновляю сообщения строятся с новым количеством голосов "за", "против", а также с новыми чистыми голосами.
Моя проблема в том, что мне нужно знать, был ли первый запрос вставкой или обновлением, потому что, если это обновление, мне нужно будет вычесть старый голос и добавить новый, но id это просто вставка, мне не нужно ничего вычитать и просто увеличивать количество голосов.
2 answers
Я бы посоветовал вам не оптимизировать подсчет голосов преждевременно, и после каждого нового голосования за какой-либо пост вы просто пересчитываете все голоса за этот пост, независимо от того, было ли это INSERT
или UPDATE
, что вызвало пересчет. Затем сохраните результат в БД.
Более того, проще выбросить даже кэширование общего количества голосов и вычислять их на лету, когда вам нужно.
Только когда вы сталкиваетесь с проблемами производительности, вам следует измерить свои расходы и проверить, что узкое место. Скорее всего, подсчет голосов не должен быть первым, что нужно оптимизировать в вашем приложении.
Сделайте свою жизнь проще.
Предполагая, что у вас есть PRIMARY KEY
на столе, вы могли бы сделать это:
SET @last_insert_id := IFNULL(LAST_INSERT_ID(), 0);
INSERT ... ON DUPLICATE KEY UPDATE ...
SELECT IFNULL(LAST_INSERT_ID(), 0) <> @last_insert_id AS inserted;
Если inserted
ИСТИННО, запись была вставлена, если ЛОЖНО, существующая запись была обновлена.
Конечно, этот код предполагает, что первый LAST_INSERT_ID()
не был установлен из вставки в другую таблицу.