Trigger auf UPDATE nach UPDATE?

13

Ich möchte einen Trigger auslösen, um die Zeit eines Updates wie folgt aufzuzeichnen:

CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END

Das Problem ist, dass dieser Trigger beim Aktualisieren der updatedSpalte auch ein anderes Aktualisierungsereignis darstellt, das den Trigger ausführt. Dadurch wird eine Endlosschleife erstellt, die nicht funktioniert.

Wie kann ich die Aktualisierungszeit in der entsprechenden Spalte speichern?

Ich möchte einen Trigger verwenden, da die Tabelle viele Spalten enthält. Wenn ich versuche, die Aktualisierungszeit manuell festzulegen, müsste ich viele Abfragen ändern.

Googlebot
quelle

Antworten:

17

Verwenden Sie BEFOREstattdessen einen Trigger und legen Sie die updatedSpalte fest, der ein Wert zugewiesen wird NEW.updated(dies wäre eine einfache Zuweisung, keine UPDATE). Auf diese Weise werden keine zusätzlichen UPDATEs ausgelöst .

Ihr Abzugskörper wird einfach so aussehen

SET NEW.updated = NOW()

Normalerweise verwende ich AFTERTrigger nur zum Ändern anderer Tabellen, BEFOREzum Ändern der neuen (oder aktualisierten) Zeile oder zum Unterdrücken DELETE.

dezso
quelle
1

Wenn Sie wie in Ihrem Fall das aktualisierte Feld jedes Mal ändern möchten, wenn der Datensatz geändert wurde, benötigen Sie keinen Auslöser.

Sie können die automatische Initialisierung / Aktualisierung von MySQL folgendermaßen verwenden:

ALTER TABLE `yourtabelname` ADD `updated` DATETIME on update CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP

Oder zum Zeitpunkt der Tabellenerstellung aus den Dokumenten :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Tobias Beuving
quelle