Maison >base de données >tutoriel mysql >Comment puis-je empêcher les déclencheurs MySQL « APRÈS MISE À JOUR » de se déclencher sur des lignes inchangées ?
Empêcher les déclencheurs MySQL de s'exécuter sur des lignes non modifiées
Les déclencheurs MySQL s'exécutent lorsqu'une opération spécifique se produit sur une table, telle qu'une insertion, une mise à jour ou une suppression. Cependant, par défaut, le déclencheur « après mise à jour » s'active même si aucune modification n'a été apportée aux lignes du tableau.
Pourquoi le déclencheur « Après la mise à jour » s'exécute-t-il même s'il n'y a aucun changement ?
La manière normale de détecter les changements dans une ligne mise à jour consiste à comparer les valeurs de colonnes individuelles entre les "nouvelles" et "anciennes" versions de la ligne. Cependant, à mesure que le nombre de colonnes dans le tableau augmente, cette approche devient fastidieuse et sujette aux erreurs.
Solution : exploiter les horodatages des lignes pour identifier les changements
Une façon intéressante de résoudre ce problème consiste à utiliser une colonne d'horodatage de ligne. MySQL gère deux colonnes d'horodatage pour chaque ligne : l'horodatage de création et l'horodatage de mise à jour. Ces horodatages sont automatiquement mis à jour chaque fois qu'une ligne est insérée ou mise à jour.
Exécution du déclencheur basée sur une comparaison d'horodatage
En comparant les nouveaux et anciens horodatages, nous pouvons déterminer si des modifications ont été apportées à la ligne. Le code déclencheur suivant illustre cette approche :
<code class="language-sql">CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts <> OLD.ts THEN -- 已进行更改;执行触发器主体 END IF; END;</code>
Dans ce déclencheur, "NEW.ts" et "OLD.ts" représentent respectivement les nouvelles et anciennes valeurs d'horodatage. Si les valeurs sont différentes, un changement s'est produit et le corps du déclencheur est exécuté.
Exemple
Considérons l'exemple suivant :
<code class="language-sql">CREATE TABLE foo (a INT, b INT, ts TIMESTAMP); -- 插入一些行 INSERT INTO foo (a, b) VALUES (1, 1); INSERT INTO foo (a, b) VALUES (2, 2); INSERT INTO foo (a, b) VALUES (3, 3); -- 触发器定义 DELIMITER /// CREATE TRIGGER ins_sum AFTER UPDATE ON foo FOR EACH ROW BEGIN IF NEW.ts <> OLD.ts THEN INSERT INTO bar (a, b) VALUES (NEW.a, NEW.b); END IF; END; /// DELIMITER ; -- 不更改地更新 UPDATE foo SET b = 3 WHERE a = 3; -- 更改地更新 UPDATE foo SET b = 4 WHERE a = 3;</code>
Le déclencheur ne s'exécutera pas après avoir effectué la première mise à jour (sans apporter de modifications). Cependant, la deuxième mise à jour modifie la ligne et le déclencheur est exécuté, insérant la nouvelle ligne dans la table « bar ».
Cette solution élimine le besoin de comparer explicitement les valeurs de colonnes individuelles et garantit que le déclencheur n'est exécuté que lorsqu'une modification réelle est apportée à la ligne.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!