Maison >base de données >tutoriel mysql >Comment puis-je exécuter un déclencheur MySQL uniquement lorsque les données changent réellement après une MISE À JOUR ?

Comment puis-je exécuter un déclencheur MySQL uniquement lorsque les données changent réellement après une MISE À JOUR ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-13 22:15:46249parcourir

How Can I Make a MySQL Trigger Execute Only When Data Actually Changes After an UPDATE?

Déclencheur MySQL UPDATE : exécuté uniquement lorsque les données changent

Les déclencheurs MySQL vous permettent d'effectuer automatiquement des actions lorsque des événements spécifiques de base de données (tels que des mises à jour de tables) se produisent. Cependant, vous souhaiterez parfois un déclencheur qui s'exécute uniquement lorsque les données de la ligne mise à jour changent réellement.

Question :

Le déclencheur intégré « APRÈS MISE À JOUR » ne fait pas de distinction entre les mises à jour qui modifient les données et les mises à jour qui ne le font pas. Cela peut conduire à une exécution inutile du déclencheur, en particulier lorsqu'il s'agit de tables comportant de nombreuses colonnes.

Solution :

Bien qu'il ne soit pas possible de comparer les modifications apportées à toutes les colonnes directement dans un déclencheur, il existe une solution de contournement utilisant des horodatages. Chaque fois qu'une ligne est modifiée, MySQL met automatiquement à jour la colonne d'horodatage de la ligne. Par conséquent, vous pouvez utiliser cet horodatage pour déterminer si les données ont changé.

Mise en œuvre :

  1. Ajouter une colonne d'horodatage : Créez une colonne d'horodatage dans la table sur laquelle vous souhaitez déclencher.
  2. Créez un déclencheur : Créez un déclencheur "APRÈS MISE À JOUR" qui compare l'ancienne valeur d'horodatage à la nouvelle valeur d'horodatage. S'ils sont différents, effectuez l'action requise ; sinon, ne faites rien.

Voici un exemple :

<code class="language-sql">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;</code>

Avantages :

  • Exécuté uniquement lorsque les données changent.
  • Aucun code personnalisé requis pour comparer les colonnes.
  • Peut être utilisé avec des tableaux de n'importe quelle taille et nombre de colonnes.

Remarque :

Cette solution s'appuie sur le comportement de mise à jour automatique de l'horodatage de MySQL. Si votre application met explicitement à jour l’horodatage, elle risque de ne pas fonctionner comme prévu.

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!

Déclaration:
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