Attivare UPDATE dopo UPDATE?


13

Voglio fare un trigger per registrare l'ora di qualsiasi aggiornamento come:

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

Il problema è che quando questo trigger tenta di aggiornare la updatedcolonna, è anche un altro evento di aggiornamento che esegue il trigger. Questo creerà un ciclo infinito, che non funziona.

Come posso memorizzare l'ora di aggiornamento nella colonna corrispondente?

Vorrei usare un trigger perché ci sono molte colonne nella tabella. Se provo a impostare l'ora di aggiornamento manualmente, dovrei modificare molte query.

Risposte:


17

Utilizzare BEFOREinvece un trigger e impostare la updatedcolonna che assegna un valore a NEW.updated(questo sarebbe un compito semplice, non un UPDATE). In questo modo non attiverai ulteriori UPDATEs.

Il tuo corpo di innesco apparirà semplicemente

SET NEW.updated = NOW()

Di solito uso i AFTERtrigger solo per modificare altre tabelle, BEFOREper modificare la nuova riga (o aggiornata) o per sopprimere DELETE.


1

Se come nel tuo caso, vuoi cambiare il campo aggiornato ogni volta che il record è stato modificato, non hai bisogno di un trigger.

Puoi utilizzare l'inizializzazione / aggiornamento automatico di MySQL in questo modo:

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

O al momento della creazione della tabella, dai documenti :

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.