2012-03-13 20 views
25

Actualmente estoy usando dos consultas de actualización y me pregunto si hay alguna manera de reducirla a una.Campo de actualización de MySQL IF NULL u otro valor

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

que estoy tratando de conseguir una consulta que haría la actualización Más de este modo:

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

Una instrucción de inserción o eliminación de actualización solo puede actualizar una tabla/vista. ¡Buen intento! – Har

+0

@HarHaHu OP actualiza solo una tabla, por lo que está perfectamente bien. –

+0

@HarHaHu es solo una tabla mientras la leo;) –

Respuesta

59

creo que es que es posible que usted pueda hacer esto utilizando una instrucción IF. La instrucción IF toma 3 parámetros cuando se está usando la expresión: valor, si es verdad, si es falso valor

Así, en su caso, usted probablemente podría escribir sus consultas de una sola vez como la siguiente:

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; 

De esta manera, si la expresión es verdadera, entonces field3 será NOW() y de lo contrario, se mantendrá como estaba.

+0

La fecha provoca un error de mysql, cambia a '2011-01-01 00:00:00' – Madarco

0

Si field3 tienen que actualizarse con una condición diferente de field1 y field2 una, pienso que usted no se puede hacer todo en una consulta Lo que puede hacer es un TRANSACTION si las consultas deben ejecutarse juntas o nada.

10

En su caso, usted podría utilizar 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 opcional

Cuestiones relacionadas