2013-05-16 30 views
8

我已经使用下面的查询:条件对重复密钥更新(更新仅在特定条件为真)

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有条件的,所以它会做到以下几点:

  • IFlastupdate小于20分钟前(lastupdate > NOW() - INTERVAL 20 MINUTE)。
  • True:更新lastupdate = NOW(),加一个到programruncount,然后更新ip = :ip
  • 错误:所有字段应保持不变。

我不太确定我会怎样做,但环顾四周后,我试着在ON DUPLICATE KEY UPDATE部分使用IF声明。

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); 

因此,如果检查的条件和返回提供了两个值中的一个,因为它的参数。见MySQL's Flow Control Operators