o mysql actualiza várias colunas com o mesmo agora ()

preciso de actualizar 2 colunas datetime, e preciso que sejam exactamente iguais, usando a versão do mysql 4.1.20. Estou a usar esta pergunta:

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

é Seguro ou há uma chance de que as colunas são atualizadas com tempo diferente, por causa das 2 chamadas visíveis para now()?
Eu não acho que ele pode ser actualização com valores diferentes (eu acho que internamente o mysql chama now() apenas uma vez por linha ou algo semelhante), mas eu não sou um especialista, o que você acha?

Quanto à segunda questão esta pesquisa não actualiza as colunas:

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

Encontrei uma solução:

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

Eu encontrei isto em documentos de MySQL e depois de alguns testes funciona:

A seguinte declaração define o col2 para o valor col1 actual (actualizado), não para o valor col1 original. O resultado é que col1 e col2 ter o mesmo valor. Este comportamento difere do SQL padrão.

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

Na segunda pergunta, Não tenho respostas, não encontrei nada no mysql. médicos sobre isto.
 120
Author: Radu Maris, 2016-11-01 07:05:48
O Mysql não é muito esperto. Quando você quer usar o mesmo horário em várias consultas de atualização ou inserção, você precisa declarar uma variável.

Quando você usar a função now(), o sistema irá chamar a data-limite actual sempre que você a ligar noutra consulta.

 6
Author: Olivier, 2017-12-16 15:05:12

Poderá guardar o valor de uma variável now () numa variável antes de executar a pesquisa de actualização e depois usar essa variável para actualizar ambos os campos last_update e last_monitor.

Isto irá assegurar que o now() é executado apenas uma vez e que o mesmo valor é actualizado em ambas as colunas que necessita.

 1
Author: Sachin Shanbhag, 2010-09-27 09:03:55

Poderá colocar o seguinte código no valor por omissão da coluna timestamp: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, por isso, ao actualizar as duas colunas, tome o mesmo valor.

 1
Author: Danny, 2013-06-13 09:49:40

Se você realmente precisa ter certeza de que now() tem o mesmo valor, você pode executar duas consultas (que vai responder a sua segunda pergunta, também, nesse caso, você está pedindo para update last_monitor = to last_update, mas last_update não tenha sido atualizado ainda)

Podias fazer algo do género:
mysql> update table set last_update=now() where id=1;
mysql> update table set last_monitor = last_update where id=1;
De qualquer forma, acho que o mysql é inteligente o suficiente para pedir {[[1]} apenas uma vez por consulta.
 0
Author: sathia, 2013-06-13 09:50:46