Preciso atualizar 2 colunas de data e hora e preciso que sejam exatamente iguais, usando o mysql versão 4.1.20. Estou usando esta consulta:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
É seguro ou há uma chance de que as colunas sejam atualizadas com tempos diferentes, por causa das 2 chamadas visíveis para now()
?
Não acho que possa ser atualizado com valores diferentes (acho que internamente o mysql chama now()
apenas uma vez por linha ou algo semelhante), mas não sou um especialista, o que você acha?
Atualização: a segunda questão foi extraída aqui .
mysql
sql-update
Radu Maris
fonte
fonte
Respostas:
Encontrou uma solução:
mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
Eu encontrei isso no MySQL Docs e depois de alguns testes, funciona:
fonte
Mysql não é muito inteligente. Quando você deseja usar o mesmo carimbo de data / hora em várias atualizações ou consultas de inserção, você precisa declarar uma variável.
Ao usar a
now()
função, o sistema chamará o carimbo de data / hora atual sempre que você chamá-lo em outra consulta.fonte
O MySQL avalia now () uma vez por instrução quando a instrução começa a ser executada. Portanto, é seguro ter várias chamadas now () visíveis por instrução.
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)
fonte
Você pode armazenar o valor de um now () em uma variável antes de executar a consulta de atualização e então usar essa variável para atualizar os campos
last_update
elast_monitor
.Isso garantirá que o now () seja executado apenas uma vez e o mesmo valor seja atualizado nas duas colunas de que você precisa.
fonte
Você pode colocar o seguinte código no valor padrão da coluna de carimbo de data / hora:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
portanto, na atualização, as duas colunas têm o mesmo valor.fonte
Se você realmente precisa ter certeza de que
now()
tem o mesmo valor, pode executar duas consultas (que responderão à sua segunda pergunta também, nesse caso você está perguntando,update last_monitor = to last_update
maslast_update
ainda não foi atualizado)você poderia fazer algo como:
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
now()
apenas uma vez por consulta.fonte
Existem 2 maneiras de fazer isso;
Primeiro , eu aconselharia você a declarar now () como uma variável antes de injetá-lo na instrução sql. Digamos;
var x = now(); mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;
Logicamente, se você deseja uma entrada diferente para last_monitor, então você adicionará outra variável como;
var y = time(); mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;
Desta forma, você pode usar as variáveis quantas vezes puder, não apenas em instruções mysql, mas também na linguagem de script do lado do servidor (como o PHP) que você está usando em seu projeto. Lembre-se de que essas mesmas variáveis podem ser inseridas como entradas em um formulário no front-end do aplicativo. Isso torna o projeto dinâmico e não estático.
Em segundo lugar, se now () indica a hora da atualização, então usando mysql você pode decalre a propriedade da linha como um timestamp. Cada vez que uma linha é inserida ou atualizada, a hora também é atualizada.
fonte