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
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
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!