Maison > base de données > tutoriel mysql > Comment résoudre l'erreur de mise à jour de la table induite par un déclencheur MySQL ?

Comment résoudre l'erreur de mise à jour de la table induite par un déclencheur MySQL ?

DDD
Libérer: 2024-12-26 22:44:13
original
214 Les gens l'ont consulté

How to Resolve the MySQL Trigger-Induced Table Update Error?

Dilemme de mise à jour de table induite par un déclencheur

Un défi courant survient lorsque l'on tente de mettre à jour la même table dans son propre déclencheur après une mise à jour. Cela devient évident lorsqu'un déclencheur est conçu pour modifier une colonne spécifique du tableau en fonction des modifications apportées aux autres colonnes de la même ligne.

Exemple : Calculer les totaux des colonnes

Considérez le scénario suivant, où nous souhaitons mettre à jour la colonne "votes_total" dans le tableau "products_score" à chaque fois qu'un score est modifié :

CREATE TRIGGER upd_total_votes AFTER UPDATE ON products_score
FOR EACH ROW
UPDATE
    products_score
SET
    products_score.votes_total =
        (SELECT
             (votes_1 + votes_2 + votes_3 + votes_4 + votes_5)
         FROM
             products_score
         WHERE
             id = new.id)
Copier après la connexion

Cependant, dès en exécutant une mise à jour sur la table, nous rencontrons une erreur :

#1442 - Can't update table 'products_score' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Copier après la connexion

Cette erreur est provoquée par la référence circulaire dans la logique du déclencheur. L'instruction de mise à jour tente de modifier la colonne "votes_total", sur laquelle le déclencheur s'appuie également pour calculer le nouveau total.

Résoudre le dilemme

Pour contourner ce problème, nous pouvons modifier le déclencheur pour exécuter avant la mise à jour au lieu d'après :

CREATE TRIGGER upd_total_votes BEFORE UPDATE ON products_score
FOR EACH ROW
BEGIN
    SET new.votes_total = new.votes_1 + new.votes_2 + new.votes_3 + new.votes_4 + new.votes_5
END
;
Copier après la connexion

Dans ce déclencheur modifié, nous calculons la nouvelle valeur "votes_total" et l'attribuons au "nouveau" objet row avant que la mise à jour réelle ait lieu. Cela permet à l'instruction de mise à jour de se poursuivre sans rencontrer de problème de référence circulaire.

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