mysql mise à jour de plusieurs colonnes avec même maintenant()
J'ai besoin de mettre à jour 2 colonnes datetime, et j'en ai besoin pour être exactement la même, en utilisant la version de mysql 4.1.20. Je suis l'aide de cette requête:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
Il est sûr ou il y a une chance que les colonnes sont mises à jour avec des moments différents, en raison de la 2 visible appels à now()
?
Je ne pense pas qu'elle puisse être mise à jour avec des valeurs différentes (je pense à l'interne de mysql appels now()
juste une fois par ligne ou quelque chose de similaire), mais je ne suis pas un expert, qu'en pensez-vous?
Mise à jour:
Deuxième question a été extrait ici.
- Je vous suggère de retirer votre deuxième question, à partir d'ici, et éventuellement le transférer dans un autre post.
Vous devez vous connecter pour publier un commentaire.
Trouvé une solution:
J'ai trouvé cette dans MySQL Docs et après quelques essais cela fonctionne:
Mysql n'est pas très habile. Lorsque vous souhaitez utiliser la même heure dans de multiples mise à jour ou de requêtes de type insert, vous devez déclarer une variable.
Lorsque vous utilisez le
now()
fonction, le système appelle le timestamp actuel chaque fois que vous appelez dans une autre requête.Vous pouvez stocker la valeur d'un now() dans une variable avant d'exécuter la requête de mise à jour et ensuite utiliser cette variable pour mettre à jour les champs
last_update
etlast_monitor
.Cela permettra d'assurer le now() est exécutée qu'une seule fois et de 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 timestamp:
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
, de sorte à mettre à jour les deux colonnes de prendre la même valeur.MySQL évalue maintenant() une fois par déclaration lors de la déclaration de commencement d'exécution. Donc, il est sûr d'avoir de multiples visible maintenant() appelle par instruction.
Si vous avez vraiment besoin d'être sûr que
now()
a la même valeur, vous pouvez exécuter deux requêtes (qui va répondre à votre deuxième question, dans ce cas, vous demandez àupdate last_monitor = to last_update
maislast_update
n'a pas encore été mis à jour)vous pourriez faire quelque chose comme:
de toute façon je pense que mysql est assez intelligent pour demander
now()
seulement une fois par requête.Il existe 2 moyens pour cela;
Première, je vous conseillerais de vous déclarer maintenant() comme une variable avant de l'injecter dans l'instruction sql. Permet de dire;
Logiquement, si vous souhaitez une autre entrée pour last_monitor alors vous allez ajouter une autre variable comme;
De cette façon, vous pouvez utiliser les variables autant de fois que vous le pouvez, non seulement dans mysql états, mais aussi dans l'exécution de scripts côté serveur-langue(comme PHP) que vous utilisez dans votre projet.
Souvenez-vous de ces mêmes variables peuvent être insérés comme des entrées dans un formulaire sur le front-end de l'application. Qui rend le projet dynamique et non statique.
Deuxièmement si maintenant() indique la durée de la mise à jour puis à l'aide de mysql, vous pouvez decalre la propriété de la ligne sous la forme d'un timestamp. Chaque fois qu'une ligne est insérée ou mise à jour de temps est aussi mis à jour.