2012-03-13 9 views
25

Attualmente sto utilizzando due query di aggiornamento e mi chiedo se esiste un modo per ridurlo a uno.Campo di aggiornamento di MySQL del set IF NULL o altro valore

field1 OFTYPE INT 
field2 OFTYPE DATETIME 
field3 OFTYPE DATETIME 

UPDATE `Table1` SET `field1` = `field1` + 1, `field2` = NOW() WHERE `id` = $id; 
UPDATE `Table1` SET `field3` = NOW() WHERE `id` = $id AND (`field3` < '2011-00-00 00:00:00' OR `field3` IS NULL); 

Sto cercando di ottenere una query che avrebbe fatto l'UPDATE più in questo modo:

UPDATE `Table1` 
SET `field1` = `field1` + 1, 
    `field2` = NOW(), 
    `field3` = ISNULL(NOW(), `first_seen`); 
+0

Un'istruzione di inserimento o eliminazione aggiornamento può aggiornare solo una tabella/vista. Bel tentativo però! – Har

+0

@HarHaHu l'OP aggiorna solo una tabella, quindi questo è perfettamente a posto. –

+0

@HarHaHu è solo una tabella mentre la leggo;) –

risposta

59

Penso che sia è possibile per voi per fare questo usando un'istruzione IF. L'istruzione IF prende 3 parametri quando lo si usa: l'espressione, il valore se vero, valore se falso

Quindi nel tuo caso, probabilmente si potrebbe scrivere le vostre domande in una volta come il seguente:

UPDATE Table1 
SET 
    field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = IF(field3 < '2011-00-00 00:00:00' OR field3 IS NULL, NOW(), field3) 
WHERE id = $id; 

In questo modo, se espressione è vera, allora field3 sarà NOW() e in caso contrario rimarrà come era.

+0

La data provoca un errore mysql, cambia in '2011-01-01 00:00:00' – Madarco

0

Se field3 devono essere aggiornati con una condizione diversa da field1 e field2, suppongo che tu non posso fare tutto in una query. Quello che puoi fare è un TRANSACTION se le query devono essere eseguite insieme o nulla.

10

Nel tuo caso si potrebbe usare CASE *:

UPDATE Table1 
SET field1 = field1 + 1, 
    field2 = NOW(), 
    field3 = 
     CASE 
     WHEN field3 < '2011-00-00 00:00:00' THEN /* Evaluates to false if NULL */ 
      NOW() 
     WHEN field3 IS NULL THEN 
      NOW() 
     ELSE /* Don't change */ 
      field3 
     END 
WHERE id = 1 

* Pun opzionale

Problemi correlati