Обновление отметки времени в таблице с помощью команды REPLACE INTO - PullRequest
1 голос
/ 16 сентября 2009

У меня есть система плюс / минус, где пользователь может добавить один или минус один из поста в блоге.

Моя таблица базы данных (MySQL) выглядит следующим образом: Идентификатор пользователя идентификатор входа голосовать - +1 или -1 TIMESTAMP

Я установил для timeStamp значение по умолчанию CURRENT_TIMESTAMP.

У меня есть методы плюс () и минус (). Оба делают одно и то же, но один добавляет +1 в голосование, а другой - -1. Поскольку (идентификатор пользователя, entryid) является первичным ключом, я использую REPLACE INTO. INSERT INTO вызывает ошибку дублирования. INSERT IGNORE не позволяет пользователю изменять голосование с +1 на -1

"REPLACE INTO votes(userid, entryid, vote) VALUES(:uid,:eid, -1)";

Игнорировать значения ..

Несмотря на то, что REPLACE INTO работает отлично, я упорядочиваю по отметке времени, поэтому, когда кто-то нажимает +1 во второй раз после голосования, он обновляет отметку времени, и это приводит к началу списка.

Кто-нибудь знает решение этой проблемы?

ps извините за плохой заголовок. Не могу придумать подходящего.

1 Ответ

5 голосов
/ 16 сентября 2009

Используя синтаксис INSERT ... ON DUPLICATE KEY UPDATE, вы можете выполнить встроенную проверку и обновлять только временную метку, ЕСЛИ голос действительно изменился:

INSERT INTO 
  votes 
SET 
  userid = :uid, 
  entryid = :eid, 
  vote = :vote,
  timeStamp = NOW()  /* I'm being explicit here -- you don't need this */
ON DUPLICATE KEY UPDATE 
  vote = :vote, 
  timeStamp = IF(vote = :vote, timeStamp, NOW())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...