条件ON DUPLICATE KEY UPDATE(仅在特定条件为真时更新)

Dan*_*Dan 15 mysql sql pdo

我使用了以下查询:

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

但是,我也想制作ON DUPLICATE KEY UPDATE条件,所以它将执行以下操作:

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

我不确定如何做到这一点,但在环顾四周后,我尝试IFON DUPLICATE KEY UPDATE部分中使用Statement .

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);
Run Code Online (Sandbox Code Playgroud)

但是我收到以下错误: #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

Aru*_* G. 33

你错误地使用了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);
Run Code Online (Sandbox Code Playgroud)

因此IF检查条件并返回作为参数提供的两个值之一.请参阅MySQL的流控制运算符.

  • 这会使字段保持不变,但无论如何它仍然会进行更新。如果不满足上次更新条件,是否有办法不执行任何操作? (2认同)