Eintrag aktualisieren OHNE Zeitstempel zu aktualisieren

76

Ich habe einen Zeitstempel in einer MySQL-Tabelle mit dem Attribut "ON UPDATE CURRENT_TIMESTAMP". Gibt es eine Möglichkeit, die Aktualisierung des Zeitstempels zu besonderen Anlässen manuell zu deaktivieren? (zB: Aktualisieren des Eintrags, um einen Blog-Beitrag zu überarbeiten, aber nicht zu aktualisieren)

Dharman
quelle

Antworten:

47

Gibt es eine Möglichkeit, die Aktualisierung des Zeitstempels zu besonderen Anlässen manuell zu deaktivieren? (zB: Aktualisieren des Eintrags, um einen Blog-Beitrag zu überarbeiten, aber nicht zu aktualisieren)

Klingt so, als müssten Sie die Standardeinschränkung so konfigurieren, dass die Spalte nur beim Einfügen ausgefüllt wird:

DEFAULT CURRENT_TIMESTAMP

Wenn Sie dies nur so ändern, wird durch Überarbeitungen der zu aktualisierende Zeitstempelwert nicht ausgelöst. IE: Wenn Sie gestern den Blogpost erstellt und heute einen Tippfehler korrigiert hätten, wäre das Datum in der Spalte immer noch für gestern.

OMG Ponys
quelle
1
Können Sie eine SQL-Anweisung zum Aktualisieren des Felds für andere anzeigen, ich habe es selbst herausgefunden?
ein Codierer
Was ist, wenn ich das last_updatedFeld ON UPDATE CURRENT_TIMESTAMPwie gewohnt aktualisieren möchte ( Verhalten beibehalten), außer wenn die Aktualisierung nur für eine bestimmte Spalte durchgeführt wurde ? Eigentlich modelliere ich eine Metadaten-Datenbank, um Informationen über bestimmte crons (deren Quelle, Senke, last_completion_time ) beizubehalten . Also last_updatedmuss das Feld nur aktualisiert werden, wenn das Cron tatsächlich geändert wurde (und nicht, wenn das Cron- last_completion_timeFeld aktualisiert wurde)
y2k-shubham
143

Sie können den Wert der Spalte im Aktualisierungsbefehl manuell auf den aktuellen Wert setzen:

UPDATE table SET x=y, timestampColumn=timestampColumn WHERE a=b;

Wenn Sie den Wert in der Abfrage nicht festlegen, wird er gemäß der Tabellendefinition auf den aktuellen Zeitstempel aktualisiert.

Andy
quelle
13
"langsamer" - wie viel? Länger als es das OP braucht, um die Magie zu entfernen ON UPDATE, NOW()all seine anderen Abfragen zu ergänzen und seine App erneut zu testen?
Andy
Wie viel langsamer ist, hängt von der Anzahl der zu aktualisierenden Zeilen ab. Wenn Sie mit Systemprotokollen mit buchstäblich Millionen von Zeilen arbeiten, ist dies nicht nur langsam, sondern jedes Mal langsam, wenn Sie diese Abfrage ausführen. Ich schlage nicht vor, DEFAULTWert zu entfernen ; nur dieON UPDATE
Mikhail
2
Danke, das ist genau das, was ich brauchte. Ich habe die Tabelle "Blogposts" und wenn ich die Anzahl der Ansichten aktualisiere, wird die Spalte "datetime_edited" (beim Aktualisieren des Zeitstempels) aktualisiert. Bei jeder anderen Gelegenheit muss das Feld "datetime_edited" aktualisiert werden - Titel- oder Beschreibungsänderungen, Hochladen neuer Bilder usw.
fsasvari
2
Ich wünschte, ich könnte dies mehr als einmal positiv bewerten! Ich wusste nicht einmal, dass Sie in einer Update-Anweisung auf eine Spalte im Datensatz verweisen können! Eine ganz neue Welt!
Samson
Vielen Dank, dies ist eine hervorragende Lösung, genau das, was ich brauche. Empfehlen.
Piotr Stępniewski
24

So aktualisieren Sie Ihre Tabelle / Ihren Zeitstempel automatisch:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP 
                       ON UPDATE CURRENT_TIMESTAMP;

Damit es nicht automatisch aktualisiert wird:

ALTER TABLE myTable
CHANGE myTimestampColumn
        myTimestampColumn TIMESTAMP NOT NULL
                       DEFAULT CURRENT_TIMESTAMP;

HINWEIS: Der Teil "default current_timestamp" setzt ihn nur zur Standardzeit auf den aktuellen Stempel, da das Feld nicht null ist. Sie können sowohl die Nicht-Null als auch die Standardeinstellung entfernen, wenn Sie möchten.

Olie
quelle
9

Verwenden Sie keine Zeitstempel, sondern verfolgen Sie die Zeiten manuell.

Wenn Sie einen Datensatz wirklich aktualisieren möchten und seinen Zeitstempel nicht aktualisieren möchten, verwenden Sie:

UPDATE `table` SET `timestamp` = `timestamp`, `col` = 'new data' …;
stricken
quelle
13
"Keine Zeitstempel verwenden", warum?
Petah
4
Sie können nur Zeiten vom 1.1.1970 bis 31.12.2037 darstellen; Nur die erste Zeitstempelspalte wird automatisch aktualisiert. Beim Wiederherstellen aus einer Sicherung werden Zeitstempel an die lokale Zeitzone angepasst. Und abhängig von Ihrer Anwendung möchten Sie möglicherweise nicht, dass diese Spalte aktualisiert wird, wenn Sie eine SQL-Aktualisierungsanweisung in Ihrem Backand ausführen (Sie möchten nur, dass der Zeitstempel aktualisiert wird, wenn Sie Ihr Frontend zum Bearbeiten von Daten verwenden)
stricken Sie
Zeitstempel sind ausdrücklich dazu gedacht, die gegenwärtigen Zeiten zu verfolgen, daher gibt es kein Problem damit, dass der Wertebereich begrenzt ist. "Nur erste Spalte" ist ebenfalls kein Problem. Wenn Sie mindestens MySQL 4.1.3 verwenden, ist die lokale Zeitzone kein Problem, wenn Sie mysqldump für die Sicherung verwendet haben.
AnrDaemon
1
Ich bin mir sicher, dass wir Unterstützung für Datumsbereiche nach 2037 erhalten werden, lange bevor wir uns diesem Grenzwert nähern. Die Umstellung historischer Daten auf das neue Zeitstempelformat sollte sehr einfach sein (wenn nicht automatisch). Außerdem unterstützt MySQL mindestens seit der Veröffentlichung von Version 5.6.10 Anfang 2013 mehrere Zeitstempelspalten. Wenn Sie nicht möchten, dass ein Zeitstempelwert aktualisiert wird, wenn ein Datensatz aktualisiert wird, geben Sie ON UPDATE ...
nextgentech nicht an
0

Wenn Sie den Zeitstempel bei der Aktualisierung ändern, müssen Sie berücksichtigen, dass der Wert "bei Aktualisierung Current_timestemp" nicht aktualisiert wird, wenn der Wert aktualisiert, aber nicht geändert wurde (Aktualisierung des Speicherwerts). In diesem Fall sollten Sie den Zeitstempel festlegen manuell

SET LastUpdatedDate=NOW() WHERE

Die Idee kam von hier: Berühren Sie den MYSQL-Datensatz, um das TIMESTAMP-Feld zu aktualisieren

Pini Cheyni
quelle