it-swarm-eu.dev

Spouštět po aktualizaci UPDATE?

Chci provést spoušť pro zaznamenání času jakékoli aktualizace 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

Problém je, že když se tento spouštěč pokusí aktualizovat sloupec updated, je to také další událost aktualizace, která spouští spouštěč. Tím se vytvoří nekonečná smyčka, která nefunguje.

Jak lze uložit čas aktualizace do příslušného sloupce?

Chci použít spoušť, protože v tabulce je mnoho sloupců. Pokud se pokusím nastavit čas aktualizace ručně, musím upravit mnoho dotazů.

13
Googlebot

Místo toho použijte spouštěč BEFORE a nastavte sloupec updated, který přiřadí hodnotu NEW.updated (toto by bylo jednoduché přiřazení, ne UPDATE). Tímto způsobem nespustíte další UPDATEs.

Vaše spouštěcí tělo bude jednoduše vypadat

SET NEW.updated = NOW()

Obvykle používám spouštěče AFTER pouze pro úpravu jiných tabulek, BEFORE pro úpravu nového (nebo aktualizovaného) řádku nebo potlačení DELETE.

17
dezso

Pokud chcete, jako vždy ve vašem případě, změnit aktualizované pole pokaždé, když byl záznam změněn, nepotřebujete spouštěč.

Můžete použít automatickou inicializaci/aktualizaci MySQL takto:

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

Nebo v době vytváření tabulky z dokumentů :

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