Maison > base de données > tutoriel mysql > le corps du texte

Pourquoi ne puis-je pas mettre à jour une table dans un déclencheur qui modifie la même table dans MySQL ?

Patricia Arquette
Libérer: 2024-11-08 22:52:02
original
707 Les gens l'ont consulté

Why Can't I Update a Table Inside a Trigger That's Modifying the Same Table in MySQL?

Dépannage des déclencheurs : incompatibilité avec la modification de table

Dans MySQL, les déclencheurs sont un outil puissant utilisé pour automatiser les actions de base de données en fonction d'événements spécifiques. Cependant, lorsqu’un déclencheur rencontre des problèmes d’exécution, le dépannage est crucial. Cet article traite d'une erreur courante rencontrée lorsqu'un déclencheur MySQL ne fonctionne pas.

Description du problème :

Un utilisateur a signalé que son déclencheur ne mettait pas à jour une colonne spécifique (PTS ) lorsque la colonne linked_games correspondante dans pos_table a changé. Bien que la requête fonctionne manuellement, le déclencheur n'a pas réussi à déclencher une mise à jour.

Structure du déclencheur :

CREATE TRIGGER `upd_PTS` AFTER UPDATE ON `pos_table`
FOR EACH ROW BEGIN
    IF (NEW.played_games <> OLD.played_games)
    THEN  
        update pos_table set PTS=((NEW.won_games*2)+(NEW.tie_games*1));
    END IF;
END
Copier après la connexion

Erreur rencontrée :

Lors de la tentative de modification manuelle de la colonne Playing_games, l'utilisateur a reçu une erreur indiquant : "Impossible de mettre à jour la table pos_table dans la fonction/le déclencheur stocké car elle est déjà utilisée par l'instruction qui a invoqué cette fonction/le déclencheur stocké".

Résolution :

Le problème provenait du fait que le déclencheur tentait de modifier la même table (pos_table) qui était référencée dans l'événement déclencheur (mise à jour de play_games). Comme indiqué dans les restrictions des programmes stockés de MySQL, une fonction ou un déclencheur stocké ne peut pas modifier une table déjà utilisée par l'instruction qui l'appelle.

Solution alternative :

Pour éviter Pour résoudre ce problème, il est recommandé d'utiliser plutôt un déclencheur BEFORE INSERT. Dans ce cas, le déclencheur pourrait être modifié comme suit :

CREATE TRIGGER `upd_PTS` BEFORE INSERT ON `pos_table`
FOR EACH ROW BEGIN
    SET NEW.PTS = ((NEW.won_games*2)+(NEW.tie_games*1));
END
Copier après la connexion

Considérations supplémentaires :

En plus de l'erreur rencontrée, l'article met également en évidence le problème avec stocker une colonne calculée comme PTS. Puisqu'il peut être facilement calculé à partir d'autres colonnes lors de l'affichage, il peut être plus efficace et moins sujet aux erreurs pour éviter de le stocker dans une colonne distincte.

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