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ů.
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ší UPDATE
s.
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
.
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
);