2013-05-16 4 views
8

Ho la seguente domanda in uso:condizionato DUPLICATE KEY UPDATE (aggiornamento solo se certa condizione è vera)

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

Tuttavia, ho anche voglia di fare il ON DUPLICATE KEY UPDATE condizionale, in modo che farà il seguente:

  • SElastupdate era meno di 20 minuti fa (lastupdate > NOW() - INTERVAL 20 MINUTE).
  • Vero: Aggiornamento lastupdate = NOW(), aggiungere uno a programruncount e quindi aggiornare ip = :ip.
  • Falso: Tutti i campi devono essere lasciati gli stessi.

io non sono davvero sicuro di come avrei fatto questo, ma dopo aver guardato intorno, ho provato con un IF Dichiarazione a parte 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); 

Comunque sto ottenendo il seguente errore: #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

risposta

19

stai usando istruzione IF in modo non corretto

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

Quindi, se i controlli per una condizione e restituire uno dei due valori forniti come è parametri . Vedi MySQL's Flow Control Operators.