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.
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
.
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
);