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
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.
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.
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.
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.
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.
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