it-swarm.com.de

Nach UPDATE auf UPDATE auslösen?

Ich möchte einen Auslöser erstellen, 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 wenn dieser Trigger versucht, die Spalte updated zu aktualisieren, es sich auch um ein anderes Aktualisierungsereignis handelt, 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 einzustellen, muss ich viele Abfragen ändern.

13
Googlebot

Verwenden Sie stattdessen einen BEFORE -Trigger und setzen Sie die Spalte updated, die NEW.updated Einen Wert zuweist (dies wäre eine einfache Zuweisung, keine UPDATE). Auf diese Weise lösen Sie keine zusätzlichen UPDATEs aus.

Ihr Abzugskörper wird einfach so aussehen

SET NEW.updated = NOW()

Normalerweise verwende ich AFTER Trigger nur zum Ändern von anderen Tabellen, BEFORE zum Ändern der neuen (oder aktualisierten) Zeile oder zum Unterdrücken von DELETE.

17
dezso

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
);
1
Tobias Beuving