Ich muss 2 Datetime-Spalten aktualisieren und sie müssen mit MySQL Version 4.1.20 genau gleich sein. Ich benutze diese Abfrage:
mysql> update table set last_update=now(), last_monitor=now() where id=1;
Es ist sicher oder es besteht die Möglichkeit, dass die Spalten aufgrund der 2 sichtbaren Aufrufe von zu unterschiedlichen Zeiten aktualisiert werden now()
? .
Ich denke nicht, dass es mit unterschiedlichen Werten aktualisiert werden kann (ich denke, intern ruft MySQL now()
nur einmal pro Zeile oder ähnliches auf), aber ich bin kein Experte, was denkst du?
Update: Die zweite Frage wurde hier extrahiert .
mysql
sql-update
Radu Maris
quelle
quelle
Antworten:
Eine Lösung gefunden:
Ich habe dies in MySQL Docs gefunden und nach ein paar Tests funktioniert es:
quelle
MySQL ist nicht sehr klug. Wenn Sie denselben Zeitstempel in mehreren Aktualisierungs- oder Einfügeabfragen verwenden möchten, müssen Sie eine Variable deklarieren.
Wenn Sie die
now()
Funktion verwenden, ruft das System den aktuellen Zeitstempel jedes Mal auf, wenn Sie ihn in einer anderen Abfrage aufrufen.quelle
MySQL wertet now () einmal pro Anweisung aus, wenn die Anweisung mit der Ausführung beginnt. Es ist also sicher, mehrere sichtbare now () -Aufrufe pro Anweisung zu haben.
quelle
Sie können den Wert von now () in einer Variablen speichern, bevor Sie die Aktualisierungsabfrage ausführen, und diese Variable dann verwenden, um sowohl die Felder
last_update
als auch zu aktualisierenlast_monitor
.Dadurch wird sichergestellt, dass now () nur einmal ausgeführt wird und der gleiche Wert für beide benötigten Spalten aktualisiert wird.
quelle
Sie können den folgenden Code auf den Standardwert der Zeitstempelspalte setzen: Beim
CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
Aktualisieren nehmen die beiden Spalten denselben Wert an.quelle
Wenn Sie wirklich sicher sein müssen, dass
now()
derselbe Wert denselben Wert hat, können Sie zwei Abfragen ausführen (die auch Ihre zweite Frage beantworten. In diesem Fall werden Sie gefragt,update last_monitor = to last_update
aberlast_update
noch nicht aktualisiert).Sie könnten so etwas tun wie:
Trotzdem denke ich, dass MySQL klug genug ist,
now()
nur einmal pro Abfrage zu fragen .quelle
Hierfür gibt es zwei Möglichkeiten.
Zunächst würde ich Ihnen raten, now () als Variable zu deklarieren, bevor Sie sie in die SQL-Anweisung einfügen. Sagen wir;
Wenn Sie eine andere Eingabe für last_monitor wünschen, fügen Sie logischerweise eine weitere Variable hinzu, z.
Auf diese Weise können Sie die Variablen so oft wie möglich verwenden, nicht nur in MySQL-Anweisungen, sondern auch in der serverseitigen Skriptsprache (wie PHP), die Sie in Ihrem Projekt verwenden. Denken Sie daran, dass dieselben Variablen als Eingaben in ein Formular im Front-End der Anwendung eingefügt werden können. Das macht das Projekt dynamisch und nicht statisch.
Zweitens, wenn now () den Zeitpunkt der Aktualisierung angibt, können Sie mit mysql die Eigenschaft der Zeile als Zeitstempel dekalieren. Jedes Mal, wenn eine Zeile eingefügt oder aktualisiert wird, wird auch die Zeit aktualisiert.
quelle