Necesito actualizar 2 columnas de fecha y hora, 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 una hora 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é piensas?
Actualización: la segunda pregunta se extrajo aquí .
mysql
sql-update
Radu Maris
fuente
fuente
Respuestas:
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:
fuente
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
now()
función, el sistema llamará a la marca de tiempo actual cada vez que la llame en otra consulta.fuente
MySQL evalúa ahora () una vez por declaración cuando la declaración comienza a ejecutarse. Por lo tanto, es seguro tener múltiples llamadas ahora visibles () por declaración.
select now(); select now(), sleep(10), now(); select now(); +---------------------+ | now() | +---------------------+ | 2018-11-05 16:54:00 | +---------------------+ 1 row in set (0.00 sec) +---------------------+-----------+---------------------+ | now() | sleep(10) | now() | +---------------------+-----------+---------------------+ | 2018-11-05 16:54:00 | 0 | 2018-11-05 16:54:00 | +---------------------+-----------+---------------------+ 1 row in set (10.00 sec) +---------------------+ | now() | +---------------------+ | 2018-11-05 16:54:10 | +---------------------+ 1 row in set (0.00 sec)
fuente
Puede almacenar el valor de ahora () en una variable antes de ejecutar la consulta de actualización y luego usar esa variable para actualizar los campos
last_update
ylast_monitor
.Esto garantizará que ahora () se ejecute solo una vez y que se actualice el mismo valor en las dos columnas que necesita.
fuente
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 tanto, al actualizar, las dos columnas toman el mismo valor.fuente
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 lo está preguntandoupdate last_monitor = to last_update
perolast_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.fuente
Hay 2 formas de hacerlo;
Primero , le aconsejaría que declare now () como una variable antes de inyectarla en la declaración sql. Digamos;
var x = now(); mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;
Lógicamente, si desea una entrada diferente para last_monitor, agregará otra variable como;
var y = time(); mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;
De esta manera, puede usar las variables tantas veces como sea posible, no solo en declaraciones mysql sino también en el lenguaje de programación del lado del servidor (como PHP) que está usando en su proyecto. Recuerde que estas mismas variables se pueden insertar como entradas en un formulario en el front-end de la aplicación. Eso hace que el proyecto sea dinámico y no estático.
En segundo lugar si now () indica la hora de la actualización, utilizando mysql puede etiquetar la propiedad de la fila como una marca de tiempo. Cada vez que se inserta o se actualiza una fila, la hora también se actualiza.
fuente