Wenn ich eine Spalte in einer Tabelle vom Typ habe TIMESTAMP
und 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
test
Tabelle erstellt und Beispieldaten aktualisiert haben? Übrigens wird dietimestamp
getippte Spalte im Update nicht aktualisiert. Wenn dies nicht in derON UPDATE CURRENT_TIMESTAMP
Antworten:
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_TIMESTAMP
bedeutet, dass jederINSERT
ohne explizite Zeitstempeleinstellung die aktuelle Zeit verwendet. EbensoON UPDATE CURRENT_TIMESTAMP
bedeutet, 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,
whatevertable
ohne den Zeitstempel zu ändern, d. H.Dann müssen Sie diese Art von Update ausgeben.
UPDATE whatevertable SET something = 'newvalue', whatevercolumn = whatevercolumn WHERE someindex = 'indexvalue'
Dies funktioniert mit
TIMESTAMP
undDATETIME
Spalten. (Vor MySQL Version 5.6.5 funktionierte es nur mitTIMESTAMP
s) Wenn SieTIMESTAMP
s verwenden, werden Zeitzonen berücksichtigt: Auf einem korrekt konfigurierten Server werden diese Werte immer in UTC gespeichert und beim Abrufen in die Ortszeit übersetzt.quelle
DEFAULT CURRENT_TIMESTAMP means that any INSERT without an explicit time stamp setting results using the current time
. In meinem Fall habe ich dasDEFAULT CURRENT_TIMESTAMP
aber aufUPDATE
der Spalte nicht aktualisiert. Also ich bin nicht klar, was du in diesem Satz meinstIch denke, Sie müssen die Zeitstempelspalte so definieren
Siehe hier
quelle
DEFAULT CURRENT_TIMESTAMP
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.
quelle
INSERT
wenn keine Werte geändert, so dass ein PHP - Aufruf wie$this->pdo->lastInsertId()
Erträge0
(ohne Einsatz) anstelle der ID für die Zeile, die die Daten enthält, die das gleiche geblieben.UPDATE
ist nichtINSERT
, daher würde ich nicht erwartenlastInsertId
, einen Wert zu enthalten - unabhängig davon, ob sich eine Spalte ändert oder nicht.lastInsertId
wird im Allgemeinen nur verwendet, wennINSERT
eine neue Zeile eine ID-Spalte mit automatischer Inkrementierung enthält (um herauszufinden, welche ID zugewiesen wurde). nicht beim Ändern vorhandener Zeilen.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.
quelle
Hinzufügen, wo zu finden,
UPDATE CURRENT_TIMESTAMP
weil 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
quelle