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 est possible que les colonnes soient mises à jour avec une heure différente, en raison des 2 appels visibles à now()
?
Je ne pense pas que cela puisse être mis à jour avec des valeurs différentes (je pense qu'en interne, mysql n'appelle now()
qu'une seule fois par ligne ou quelque chose de similaire), mais je ne suis pas un expert, qu'en pensez-vous?
Mise à jour: la deuxième question a été extraite ici .
mysql
sql-update
Radu Maris
la source
la source
Réponses:
Trouvé une solution:
mysql> UPDATE table SET last_update=now(), last_monitor=last_update WHERE id=1;
J'ai trouvé cela dans MySQL Docs et après quelques tests, cela fonctionne:
la source
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
now()
fonction, le système appellera l'horodatage actuel chaque fois que vous l'appelez dans une autre requête.la source
MySQL évalue now () une fois par instruction lorsque celle-ci commence son exécution. Il est donc sûr d'avoir plusieurs appels now () visibles par instruction.
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)
la source
Vous pouvez stocker la valeur d'un 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
etlast_monitor
.Cela garantira que now () n'est exécuté qu'une seule fois et que la même valeur est mise à jour sur les deux colonnes dont vous avez besoin.
la source
Vous pouvez mettre le code suivant sur la valeur par défaut de la colonne d'horodatage:,
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
donc de mise à jour, les deux colonnes prennent la même valeur.la source
Si vous avez vraiment besoin d'être sûr que cela
now()
a la même valeur, vous pouvez exécuter deux requêtes (qui répondront également à votre deuxième question, dans ce cas, vous le demandezupdate last_monitor = to last_update
mais vous n'avezlast_update
pas encore été mis à jour)vous pouvez 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 ne demander
now()
qu'une seule fois par requête.la source
Il y a 2 façons de procéder;
Tout d'abord , je vous conseillerais de déclarer now () comme une variable avant de l'injecter dans l'instruction sql. Disons;
var x = now(); mysql> UPDATE table SET last_update=$x, last_monitor=$x WHERE id=1;
Logiquement, si vous voulez une entrée différente pour last_monitor, vous ajouterez une autre variable comme;
var y = time(); mysql> UPDATE table SET last_update=$x, last_monitor=$y WHERE id=1;
De cette façon, vous pouvez utiliser les variables autant de fois que vous le pouvez, non seulement dans les instructions mysql mais aussi dans le langage de script côté serveur (comme PHP) que vous utilisez dans votre projet. N'oubliez pas que ces mêmes variables peuvent être insérées en tant qu'entrées dans un formulaire sur le front-end de l'application. Cela rend le projet dynamique et non statique.
Deuxièmement, si now () indique l'heure de la mise à jour, alors en utilisant mysql, vous pouvez décaler la propriété de la ligne comme un horodatage. Chaque fois qu'une ligne est insérée ou mise à jour, l'heure est également mise à jour.
la source