Wann wird ein Zeitstempel (automatisch) aktualisiert?

79

Wenn ich eine Spalte in einer Tabelle vom Typ habe TIMESTAMPund standardmäßig Folgendes habe: CURRENT_TIMESTAMP Wird diese Spalte auf den aktuellen Zeitstempel aktualisiert, wenn ich den Wert einer anderen Spalte in derselben Zeile aktualisiere ?
Es scheint nicht so, aber ich bin mir nicht sicher, ob dies passieren sollte.
Ich kann nicht verstehen, was dies bedeutet ( aus der MySQL-Dokumentation ):

Wenn die Spalte automatisch aktualisiert wird, wird sie automatisch auf den aktuellen Zeitstempel aktualisiert, wenn der Wert einer anderen Spalte in der Zeile von ihrem aktuellen Wert geändert wird. Die Spalte bleibt unverändert, wenn alle anderen Spalten auf ihre aktuellen Werte gesetzt sind. Um zu verhindern, dass die Spalte aktualisiert wird, wenn sich andere Spalten ändern, setzen Sie sie explizit auf den aktuellen Wert. Um die Spalte zu aktualisieren, auch wenn sich andere Spalten nicht ändern, setzen Sie sie explizit auf den Wert, den sie haben sollte] 2

Jim
quelle
2
Warum haben Sie dies nicht versucht, indem Sie eine testTabelle erstellt und Beispieldaten aktualisiert haben? Übrigens wird die timestampgetippte Spalte im Update nicht aktualisiert. Wenn dies nicht in der ON UPDATE CURRENT_TIMESTAMP
Spaltendefinition

Antworten:

138

Gib den Befehl SHOW CREATE TABLE whatever

Schauen Sie sich dann die Tabellendefinition an .

Es hat wahrscheinlich eine Linie wie diese

logtime TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

drin. DEFAULT CURRENT_TIMESTAMPbedeutet, dass jeder INSERTohne explizite Zeitstempeleinstellung die aktuelle Zeit verwendet. Ebenso ON UPDATE CURRENT_TIMESTAMPbedeutet, dass jede Aktualisierung ohne expliziten Zeitstempel zu einer Aktualisierung des aktuellen Zeitstempelwerts führt.

Sie können dieses Standardverhalten beim Erstellen Ihrer Tabelle steuern.

Wenn die Zeitstempelspalte überhaupt nicht korrekt erstellt wurde, können Sie sie ändern.

ALTER TABLE whatevertable
     CHANGE whatevercolumn 
            whatevercolumn TIMESTAMP NOT NULL
                           DEFAULT CURRENT_TIMESTAMP 
                           ON UPDATE CURRENT_TIMESTAMP;

Dies führt dazu, dass sowohl INSERT- als auch UPDATE-Vorgänge in der Tabelle automatisch Ihre Zeitstempelspalte aktualisieren. Wenn Sie aktualisieren möchten, whatevertableohne den Zeitstempel zu ändern, d. H.

So verhindern Sie, dass die Spalte aktualisiert wird, wenn sich andere Spalten ändern

Dann müssen Sie diese Art von Update ausgeben.

UPDATE whatevertable
   SET something = 'newvalue',
       whatevercolumn = whatevercolumn
 WHERE someindex = 'indexvalue'

Dies funktioniert mit TIMESTAMPund DATETIMESpalten. (Vor MySQL Version 5.6.5 funktionierte es nur mit TIMESTAMPs) Wenn Sie TIMESTAMPs verwenden, werden Zeitzonen berücksichtigt: Auf einem korrekt konfigurierten Server werden diese Werte immer in UTC gespeichert und beim Abrufen in die Ortszeit übersetzt.

O. Jones
quelle
1
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time. In meinem Fall habe ich das DEFAULT CURRENT_TIMESTAMP aber auf UPDATEder Spalte nicht aktualisiert. Also ich bin nicht klar, was du in diesem Satz meinst
Jim
Siehe meine Bearbeitung, in der ich versucht habe zu klären. Das Standardverhalten von INSERT und UPDATE wird separat gesteuert.
O. Jones
Ja, sowohl INSERT- als auch UPDATE-Operationen, die den Namen der Zeitstempelspalte angeben, überschreiben das Standardverhalten von current_timestamp.
O. Jones
1
Danke mein Herr. Perfekte Lösung eines meiner Probleme
Edwinfad
phpMyAdmin gibt an, dass bei der SQL-Abfrage "Sie haben einen Fehler in Ihrer SQL-Syntax aufgetreten. Überprüfen Sie das Handbuch, das Ihrer MySQL-Serverversion entspricht, auf die richtige Syntax für" NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP "in Zeile 1"
Primož Kralj
13

Ich denke, Sie müssen die Zeitstempelspalte so definieren

TABELLE ERSTELLEN t1 
(
    ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

Siehe hier

Jürgen d
quelle
1
Meins hat nur dieDEFAULT CURRENT_TIMESTAMP
Jim
4

Eine automatisch aktualisierte Spalte wird automatisch auf den aktuellen Zeitstempel aktualisiert, wenn der Wert einer anderen Spalte in der Zeile von ihrem aktuellen Wert geändert wird. Eine automatisch aktualisierte Spalte bleibt unverändert, wenn alle anderen Spalten auf ihre aktuellen Werte gesetzt sind.

Um es zu erklären, stellen wir uns vor, Sie haben nur eine Zeile:

-------------------------------
| price | updated_at          |
-------------------------------
|  2    | 2018-02-26 16:16:17 |
-------------------------------

Wenn Sie nun die folgende Aktualisierungsspalte ausführen:

 update my_table
 set price = 2

Der Wert von update_at wird nicht geändert, da der Preiswert nicht geändert wurde (es war bereits 2).

Wenn Sie jedoch eine andere Zeile mit einem anderen Preiswert als 2 haben, wird der aktualisierte_at-Wert dieser Zeile (mit dem Preis <> 3) auf CURRENT_TIMESTAMP aktualisiert.

Alexander
quelle
Bestätigtes Verhalten wie in MySQL beschrieben. Darüber hinaus ist es nicht als ein zählen , INSERTwenn keine Werte geändert, so dass ein PHP - Aufruf wie $this->pdo->lastInsertId()Erträge 0(ohne Einsatz) anstelle der ID für die Zeile, die die Daten enthält, die das gleiche geblieben.
OXiGEN
@OXiGEN - UPDATEist nicht INSERT, daher würde ich nicht erwarten lastInsertId, einen Wert zu enthalten - unabhängig davon, ob sich eine Spalte ändert oder nicht. lastInsertIdwird im Allgemeinen nur verwendet, wenn INSERTeine neue Zeile eine ID-Spalte mit automatischer Inkrementierung enthält (um herauszufinden, welche ID zugewiesen wurde). nicht beim Ändern vorhandener Zeilen.
ToolmakerSteve
3

Fügen Sie einen Trigger in die Datenbank ein:

DELIMITER //
CREATE TRIGGER update_user_password 
  BEFORE UPDATE ON users
  FOR EACH ROW
    BEGIN
      IF OLD.password <> NEW.password THEN
        SET NEW.password_changed_on = NOW();
      END IF;
    END //
DELIMITER ;

Die Zeit für die Kennwortänderung wird nur aktualisiert, wenn die Kennwortspalte geändert wird.

Sibin John Mattappallil
quelle
2

Hinzufügen, wo zu finden, UPDATE CURRENT_TIMESTAMPweil für neue Leute dies eine Verwirrung ist.

Die meisten Leute werden phpmyadmin oder ähnliches verwenden.

Standardwert wählen Sie CURRENT_TIMESTAMP

Attribute (eine andere Dropdown-Liste) wählen Sie UPDATE CURRENT_TIMESTAMP

BrinkDaDrink
quelle