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 ?

Comment puis-je empêcher les déclencheurs MySQL « APRÈS MISE À JOUR » de se déclencher sur des lignes inchangées ?

DDD
Libérer: 2025-01-13 22:38:47
original
521 Les gens l'ont consulté

How Can I Prevent MySQL

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal