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

13

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 updatedcolonne, il s'agit également d'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.

Googlebot
la source

Réponses:

17

Utilisez un BEFOREdéclencheur à la place et définissez la updatedcolonne affectant une valeur à NEW.updated(ce serait une affectation simple, pas une UPDATE). De cette façon, vous ne déclencherez pas de UPDATEs supplémentaires .

Votre corps déclencheur ressemblera simplement à

SET NEW.updated = NOW()

J'utilise habituellement des AFTERdéclencheurs uniquement pour modifier d' autres tables, BEFOREpour modifier la nouvelle ligne (ou mise à jour), ou supprimer DELETE.

dezso
la source
1

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
);
Tobias Beuving
la source