Wyzwolić aktualizację po aktualizacji?

13

Chcę uruchomić wyzwalacz, aby zapisać czas każdej aktualizacji jako:

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

Problem polega na tym, że gdy ten wyzwalacz próbuje zaktualizować updatedkolumnę, jest to również inne zdarzenie aktualizacji, które uruchamia wyzwalacz. Spowoduje to utworzenie nieskończonej pętli, która nie działa.

Jak mogę zapisać czas aktualizacji w odpowiedniej kolumnie?

Chcę użyć wyzwalacza, ponieważ w tabeli jest wiele kolumn. Jeśli spróbuję ustawić czas aktualizacji ręcznie, będę musiał zmodyfikować wiele zapytań.

Googlebot
źródło

Odpowiedzi:

17

BEFOREZamiast tego użyj wyzwalacza i ustaw updatedkolumnę przypisującą wartość NEW.updated(byłoby to proste przypisanie, a nie an UPDATE). W ten sposób nie uruchomisz dodatkowych UPDATEs.

Twoje ciało wyzwalacza będzie po prostu wyglądać

SET NEW.updated = NOW()

Zwykle używam AFTERwyzwalaczy tylko do modyfikowania innych tabel, BEFOREmodyfikowania nowego (lub aktualizowanego) wiersza lub pomijania DELETE.

dezso
źródło
1

Jeśli tak jak w twoim przypadku, chcesz zmienić zaktualizowane pole za każdym razem, gdy rekord został zmieniony, nie potrzebujesz wyzwalacza.

Możesz użyć automatycznej inicjalizacji / aktualizacji MySQL w następujący sposób:

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

Lub w momencie tworzenia tabeli, z dokumentów :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Tobias Beuving
źródło