2013-05-16 3 views
8

Я следующий запрос используется:Условного дублирование KEY UPDATE (Обновить только если определенное условие истинно)

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES (:username, NOW(), 1, :ip) 
ON DUPLICATE KEY UPDATE 
lastupdate = NOW(), programruncount = programruncount + 1, ip = :ip; 

Однако, я также хочу, чтобы сделать ON DUPLICATE KEY UPDATE условно, поэтому он будет делать следующее:

  • ЕСЛИlastupdate было меньше, чем 20 минут назад (lastupdate > NOW() - INTERVAL 20 MINUTE).
  • Номер: Обновление lastupdate = NOW(), добавьте его к programruncount, а затем обновите ip = :ip.
  • False: Все поля должны быть личными.

Я не совсем уверен, как я бы это сделать, но, посмотрев вокруг, я попытался с помощью IF заявление в ON DUPLICATE KEY UPDATE части.

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES ("testuser", NOW(), "1", "127.0.0.1") 
ON DUPLICATE KEY UPDATE 
IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate, programruncount + 1), 
lastupdate, programruncount); 

Однако я получаю следующее сообщение об ошибке: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IF(lastupdate > NOW() - INTERVAL 20 MINUTE, VALUES(lastupdate, programruncount +' at line 6

ответ

19

вы используете IF заявление неправильно

INSERT INTO userlist (username, lastupdate, programruncount, ip) 
VALUES (:username, NOW(), 1, :ip) 
ON DUPLICATE KEY UPDATE 
lastupdate = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, NOW(), lastupdate), 
programruncount = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, programruncount + 1, programruncount), 
ip = IF(lastupdate > NOW() - INTERVAL 20 MINUTE, :ip, ip); 

так IF проверяет условие и возвращать один из двух значений при условии, как это параметры , См. MySQL's Flow Control Operators.

Смежные вопросы