Maison > base de données > tutoriel mysql > Pourquoi ne puis-je pas mettre à jour une table dans une fonction ou un déclencheur stocké MySQL ?

Pourquoi ne puis-je pas mettre à jour une table dans une fonction ou un déclencheur stocké MySQL ?

Linda Hamilton
Libérer: 2024-12-25 00:05:20
original
819 Les gens l'ont consulté

Why Can't I Update a Table Within a MySQL Stored Function or Trigger?

Erreur MySQL : impossible de mettre à jour la table dans la fonction/le déclencheur stocké

Question :

Lorsque vous tentez d'insérer une nouvelle ligne dans une table MySQL à l'aide d'un déclencheur, l'erreur suivante se produit :

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

Réponse :

Cette erreur se produit lorsque le déclencheur INSERT tente de modifier la table qui l'a invoqué. MySQL interdit ce comportement pour deux raisons principales :

  • Conflits de verrouillage : L'INSERT peut effectuer des opérations de verrouillage, ce qui peut conduire à des blocages si le déclencheur tente également de verrouiller la table.
  • Récursion infinie : Si le déclencheur met à jour une ligne dans la même table, cela peut provoquer le déclenchement du même déclencheur indéfiniment, ce qui entraîne une boucle infinie.

Pour résoudre cette erreur, envisagez d'utiliser les approches suivantes :

  • Accès aux nouvelles valeurs : Au lieu de modifier la table dans le déclencheur, utilisez NEW.fieldname pour accéder aux valeurs nouvellement insérées et définir d'autres champs en conséquence.
  • Modification avant insertion : Utilisez un déclencheur BEFORE INSERT pour modifier les valeurs avant qu'elles ne soient insérées dans le tableau. Cela évite le problème de récursion infinie.

Par exemple, pour créer un champ de nom court à partir des deux premiers caractères d'un nom complet, le déclencheur BEFORE INSERT suivant peut être utilisé :

CREATE TRIGGER `capital` BEFORE INSERT ON `brandnames`
FOR EACH ROW BEGIN
  SET NEW.short_name = CONCAT(UCASE(LEFT(NEW.full_name,1)) , LCASE(SUBSTRING(NEW.full_name,2)))
END
Copier après la connexion

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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal