4 votes

Erreur MySQL 1442

J'ai deux tables :

sanction avec ces attributs : DriverID, Calification, Points
people avec ces attributs : pID, city, TotalPoints

Et j'ai ce déclencheur :

DROP TRIGGER IF EXISTS updatePoints_tgr;

delimiter $$
CREATE TRIGGER
updatePoints_tgr AFTER UPDATE
ON sanctions FOR EACH ROW
 BEGIN
     if NEW.points > OLD.points 
     THEN
         UPDATE people
         SET TotalPoints = TotalPoints + (NEW.points - OLD.points)
         WHERE people.pID = NEW.DriverID;
     elseif NEW.points < OLD.points 
     THEN
         UPDATE people
         SET TotalPoints = TotalPoints - (NEW.points - OLD.points)
         WHERE people.pID = NEW.DriverID;
     END IF;
 END$$
 delimiter ;

Et quand j'essaie d'exécuter cette mise à jour

UPDATE sanctions 
JOIN people ON sanctions.DriverID=people.pID
SET points=points+6
WHERE city='Barcelona'  AND Calification='LightPenalty'

Je reçois cette erreur :

Impossible de mettre à jour la table 'people' dans une fonction/déclencheur stocké car elle est déjà utilisée par l'instruction qui a invoqué cette fonction/déclencheur.

Comment puis-je le réparer ? Merci.

J'utilise Windows 10 et le serveur MySQL 5.7.17

0voto

Nabeel Ahmed Points 356

Vous ne pouvez pas mettre à jour une table (sanctions et people) lorsque le déclencheur est invoqué :

Dans une fonction ou un déclencheur stocké, il n'est pas permis de modifier une table qui est déjà utilisée (pour la lecture ou l'écriture) par l'instruction qui a invoqué la fonction ou le déclencheur.

Cela générera une Erreur 1442 :

Code d'erreur : 1442
Impossible de mettre à jour la table 'MaTable' dans une fonction ou un déclencheur stocké car elle est déjà utilisée par l'instruction qui a invoqué cette fonction ou ce déclencheur stocké.

Votre cas : La confusion peut être due à la JOIN sur sanctions et people pour la UPDATE - rendant les deux tables en cours d'utilisation, comme indiqué ci-dessus 'utilisée' signifie 'lecture ou écriture'.


Pour tester - Essayez la requête UPDATE sans la JOIN (avec people) - si cela fonctionne, c'est certainement le cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X