Maison >base de données >tutoriel mysql >Pourquoi la mise à jour d'une table à l'intérieur d'un déclencheur provoque-t-elle l'erreur n° 1442 et comment cela peut-il être résolu ?

Pourquoi la mise à jour d'une table à l'intérieur d'un déclencheur provoque-t-elle l'erreur n° 1442 et comment cela peut-il être résolu ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-23 03:03:33215parcourir

Why Does Updating a Table Inside a Trigger Cause Error #1442, and How Can This Be Solved?

Piège du déclencheur : mettre à jour une table référencée par le déclencheur

La mise à jour de la même table dans un déclencheur peut entraîner des problèmes. Un tel exemple est présenté où une tentative est faite de mettre à jour la table products_score à l'aide d'un déclencheur qui s'exécute après une mise à jour.

Le déclencheur, comme indiqué dans le code fourni, tente de calculer et de mettre à jour la colonne votes_total en fonction de les valeurs des autres colonnes (votes_1, votes_2, ..., votes_5) dans la même table products_score. Cependant, lorsque cette mise à jour est déclenchée, une erreur se produit :

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

Solution : Utiliser un déclencheur AVANT

Pour résoudre ce problème, le déclencheur doit être modifié pour exécuter avant la mise à jour de la ligne, pas après. En s'exécutant avant la mise à jour, le déclencheur peut accéder et modifier les nouvelles valeurs attribuées à la colonne votes_total.

Le déclencheur révisé utilisant une clause BEFORE update est le suivant :

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;

Avec Cette modification, le déclencheur calcule et met à jour avec succès la colonne votes_total avant que la mise à jour réelle de la ligne ne se produise, résolvant l'erreur et permettant la fonctionnalité souhaitée.

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