mysql met à jour plusieurs colonnes avec le même maintenant ()

J’ai besoin de mettre à jour 2 colonnes datetime, et j’ai besoin qu’elles soient exactement les mêmes, en utilisant la version 4.1.20 de mysql. J’utilise cette requête:

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

C’est sûr ou il y a une chance que les colonnes soient mises à jour avec un temps différent, à cause des 2 appels visibles vers now() ?
Je ne pense pas qu’il puisse être mis à jour avec des valeurs différentes (je pense qu’en interne mysql appelle now() juste une fois par ligne ou quelque chose de similaire), mais je ne suis pas un expert, qu’en pensez-vous?

Deuxième question: pourquoi cette requête ne met pas à jour les colonnes:

 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 

Trouvé une solution:

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

Je l’ai trouvé dans MySQL Docs et après quelques tests, il fonctionne:

L’instruction suivante définit col2 sur la valeur col1 actuelle (mise à jour) et non sur la valeur col1 d’origine. Le résultat est que col1 et col2 ont la même valeur. Ce comportement diffère de SQL standard.

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

Sur la deuxième question, ne pas avoir de réponses, n’a rien trouvé sur mysql docs à ce sujet.

Mysql n’est pas très intelligent. Lorsque vous souhaitez utiliser le même horodatage dans plusieurs requêtes de mise à jour ou d’insertion, vous devez déclarer une variable.

Lorsque vous utilisez la fonction now() , le système appelle l’horodatage actuel chaque fois que vous l’appelez dans une autre requête.

Vous pouvez stocker la valeur de now () dans une variable avant d’exécuter la requête de mise à jour, puis utiliser cette variable pour mettre à jour les champs last_update et last_monitor .

Cela garantira que le now () est exécuté une seule fois et que la même valeur est mise à jour sur les deux colonnes dont vous avez besoin.

Vous pouvez mettre le code suivant sur la valeur par défaut de la colonne d’horodatage: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP , donc lors de la mise à jour, les deux colonnes prennent la même valeur.

Si vous devez vraiment être sûr que now() a la même valeur, vous pouvez lancer deux requêtes (qui répondront également à votre deuxième question, dans ce cas vous demandez de update last_monitor = to last_update à update last_monitor = to last_update mais last_update n’a pas encore été mis à jour) )

vous pourriez faire quelque chose comme:

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

de toute façon, je pense que mysql est assez intelligent pour demander now() une seule fois par requête.