Trigger table C et update table A
Bonjour,
Je bute sur un problème de trigger sans parvenir à en trouver l'explication, encore moins la solution.
Soit 3 tables, ta, tb et tc.
ta comprend les colonnes :
tb comprend les colonnes :
tc comprend les colonnes :
tb.refA référence ta.idA
tc.refB référence tb.idB
Pour chaque ligne de ta, je peux avoir de 1 à N lignes la référençant dans tb
Pour chaque ligne de tb, je peux avoir de 0 à 1 ligne la référençant dans tc. tc étend en quelque sorte tb.
Un trigger est positionné sur tc pour :
1. calculer et mettre à jour tc.surf d'après les valeurs saisies de tc.long et tc.larg : ça fonctionne.
2. calculer et mettre à jour ta.surfTotal, sachant qu'il peut y avoir plusieurs lignes dans tb référençant ta... : ça ne fonctionne pas.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| TRIGGER `CompleteSurface` BEFORE INSERT ON `TableC` FOR EACH ROW
BEGIN
DECLARE surfTotal double;
DECLARE num int;
/* calcul et màj de tc.surf */
SET NEW.surf = NEW.long * NEW.larg;
/* calcul et màj de ta.surfTotal */
SET num = (SELECT refA FROM tb WHERE tb.idB = NEW.refB);
UPDATE ta
SET ta.surfTotal = (SELECT SUM(tc.surf) FROM tc
LEFT JOIN tb ON tc.refB = tb.idB
WHERE tb.refA = num
GROUP BY tb.refA)
WHERE ta.num = num;
END; |
Mais pourtant ça marche si j'exécute dans PMA :
UPDATE ta
Code:
1 2 3 4 5
| SET ta.surfTotal = (SELECT SUM(tc.surf) FROM tc
LEFT JOIN tb ON tc.refB = tb.idB
WHERE tb.refA = (SELECT refA FROM tb WHERE tb.idB = valeur-de-refB)
GROUP BY tb.refA)
WHERE ta.num = (SELECT refA FROM tb WHERE tb.idB = valeur-de-refB); |
où valeur-de-refB correspond à NEW.refB.
Je sèche un peu là... Je ne dois pas m'y prendre comme il faut.