web-dev-qa-db-fra.com

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 mysql version 4.1.20. 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 une heure différente, à cause des 2 appels visibles à 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. tu penses?

Mise à jour: La deuxième question a été extraite ici .

77
Radu Maris

Trouvé une solution:

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

J'ai trouvé this dans MySQL Docs et après quelques tests, cela 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.

MISE À JOUR t1 SET col1 = col1 + 1, col2 = col1;

129
Radu Maris

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.

7
Olivier

MySQL évalue maintenant () une fois par instruction lorsque l'instruction commence à être exécutée. Il est donc prudent 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)
1
Rich Andrews

Vous pouvez mettre le code suivant sur la valeur par défaut de la colonne timestamp: CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ainsi de suite, les deux colonnes prennent la même valeur.

1
Danny

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 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.

1
Sachin Shanbhag

Il y a 2 façons de faire cela.

First , je vous conseillerais de déclarer now () en tant que 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 allez ajouter 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 également 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 if now () indique l'heure de la mise à jour, puis, en utilisant mysql, vous pouvez décaler la propriété de la ligne sous forme d'horodatage. Chaque fois qu'une ligne est insérée ou mise à jour, l'heure est également mise à jour.

0
Wahinya Brian

Si vous avez vraiment besoin de vous assurer que 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 demandez à 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;

quoi qu'il en soit, je pense que mysql est assez intelligent pour demander now() une seule fois par requête.

0
sathia