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?
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
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:
Na segunda pergunta, Não tenho respostas, não encontrei nada no mysql. médicos sobre isto.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;
Quando você usar a função now()
, o sistema irá chamar a data-limite actual sempre que você a ligar noutra consulta.
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.
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.
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)
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.