web-dev-qa-db-fra.com

Déclencher la mise à jour après la mise à jour?

Je veux faire un déclencheur pour enregistrer l'heure de toute mise à jour comme:

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

Le problème est que lorsque ce déclencheur essaie de mettre à jour la colonne updated, c'est également un autre événement de mise à jour, qui exécute le déclencheur. Cela créera une boucle infinie, qui ne fonctionne pas.

Comment puis-je stocker l'heure de mise à jour dans la colonne correspondante?

Je souhaite utiliser un déclencheur car il y a beaucoup de colonnes dans le tableau. Si j'essaie de définir l'heure de mise à jour manuellement, je devrais modifier de nombreuses requêtes.

13
Googlebot

Utilisez plutôt un déclencheur BEFORE et définissez la colonne updated en attribuant une valeur à NEW.updated (ce serait une simple affectation, pas un UPDATE). De cette façon, vous ne déclencherez pas de UPDATE supplémentaires.

Votre corps déclencheur ressemblera simplement à

SET NEW.updated = NOW()

J'utilise généralement les déclencheurs AFTER uniquement pour modifier les tables other, BEFORE pour modifier la nouvelle ligne (ou mise à jour), ou supprimer DELETE.

17
dezso

Si, comme dans votre cas, vous souhaitez modifier le champ mis à jour chaque fois que l'enregistrement a été modifié, vous n'avez pas besoin de déclencheur.

Vous pouvez utiliser l'initialisation/mise à jour automatique de MySQL comme ceci:

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

Ou au moment de la création de la table, à partir des documents :

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