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