mysql actualiza múltiples columnas con same ahora()


Necesito actualizar 2 columnas datetime, y necesito que sean exactamente iguales, usando mysql versión 4.1.20. Estoy usando esta consulta:

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

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

Segunda pregunta ¿por qué esto query 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
Author: Cœur, 2010-09-27

5 answers

Encontró una solución:

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

Encontré esto en MySQL Docs y después de algunas pruebas funciona:

La siguiente instrucción establece col2 al valor col1 actual (actualizado), no al valor col1 original. El resultado es que col1 y col2 tienen el mismo valor. Este comportamiento difiere del SQL estándar.

UPDATE t1 SET col1 = col1 + 1, col2 = col1;

En la segunda pregunta, no tengo ninguna respuesta, no encontré nada en mysql docs sobre esto.

 120
Author: Radu Maris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-01 07:05:48

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 utiliza la función now(), el sistema llamará a la marca de tiempo actual cada vez que la llame en otra consulta.

 6
Author: Olivier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-16 15:05:12

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

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

 1
Author: Sachin Shanbhag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-27 09:03:55

Puede poner el siguiente código en el valor predeterminado de la columna timestamp: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, así que al actualizar las dos columnas toman el mismo valor.

 1
Author: Danny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 09:49:40

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

Podrías 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
Author: sathia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-13 09:50:46