2010-09-27 12 views
61

Necesito actualizar 2 columnas de fecha y hora, y necesito que sean exactamente las mismas, usando la versión 4.1.20 de mysql. Estoy usando esta consulta:mysql actualizar varias columnas con el mismo ahora()

mysql> update table set last_update=now(), last_monitor=now() where id=1; 

Es segura o existe la posibilidad de que las columnas son de actualización diferente con el tiempo, debido a las 2 llamadas visibles a now()?
No creo que pueda actualizarse con diferentes valores (creo que internamente mysql llama a now() solo una vez por fila o algo similar), pero no soy un experto, ¿qué opinas?

Segunda pregunta de por qué esta consulta no actualiza las columnas:

mysql> update table set last_update=last_monitor=now() where id=1; 
Query OK, 0 rows affected (0.00 sec) 
Rows matched: 1 Changed: 0 Warnings: 0 
+0

Le sugiero que elimine su segunda pregunta de aquí, y eventualmente vuelva a publicarla en otra publicación. –

Respuesta

103

encontrado una solución:

mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1; 

encontré this en MySQL Docs y después de unas cuantas pruebas funciona:

los siguientes comandos actualizan col2 al valor col1 actual (actualizado), no el valor de col1 original. El resultado es que col1 y col2 tienen el mismo valor. Este comportamiento difiere del SQL estándar.

ACTUALIZACIÓN t1 SET col1 = col1 + 1, col2 = col1;

En la segunda pregunta, no tiene ninguna respuesta, no encontró nada en los documentos de mysql sobre esto.

1

Si realmente necesita estar seguro de que now() tiene el mismo valor que puede ejecutar dos consultas (que responder a su segunda pregunta demasiado , en ese caso usted está pidiendo que update last_monitor = to last_update pero last_update no se ha actualizado todavía)

que podría hacer algo como:

mysql> update table set last_update=now() where id=1; 
mysql> update table set last_monitor = last_update where id=1; 

de todos modos, creo que mysql es lo suficientemente inteligente como para pedir now() solo una vez por consulta.

+0

¿Qué hay de las dos actualizaciones?¿también crees que mysql es lo suficientemente inteligente como para combinarlos en una sola declaración? porque no. – Dementic

1

Puede almacenar el valor de un now() en una variable antes de ejecutar la consulta de actualización y luego usar esa variable para actualizar los campos last_update y last_monitor.

Esto asegurará que now() se ejecute solo una vez y el mismo valor se actualice en las dos columnas que necesite.

1

Puede poner el siguiente código en el valor predeterminado de la columna de marca de tiempo: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, por lo que al actualizar las dos columnas toman el mismo valor.

+1

AFAIK "en actualización" tiene un límite de una columna por tabla, por lo que no puede establecerlo en ambas columnas. –

4

Mysql no es muy inteligente. Cuando desee utilizar la misma marca de tiempo en varias consultas de actualización o inserción, debe declarar una variable.

Cuando usa la función now(), el sistema llamará a la marca de tiempo actual cada vez que la llame en otra consulta.

Cuestiones relacionadas