Erreur SQL 1442, Requete UPDATE ne marche pas

noxa03 Messages postés 5 Date d'inscription dimanche 24 mai 2009 Statut Membre Dernière intervention 2 décembre 2011 - 1 déc. 2011 à 23:52
noxa03 Messages postés 5 Date d'inscription dimanche 24 mai 2009 Statut Membre Dernière intervention 2 décembre 2011 - 2 déc. 2011 à 15:41
Bonjour,

J'ai voulu créer un trigger qui calcule le nouveau prix ttc d'un produit quand le produit reçois une promotion (id_promo).

Malheureusement je galère totalement étant un plus que novice en SQL, j'ai déjà pas mal cherché sur le net, mais aucun post n'a pu m'aider.

delimiter //
CREATE TRIGGER TTC_PROMO_UPDATE
        BEFORE UPDATE ON produit
                FOR EACH ROW
                        BEGIN
                                        UPDATE produit,promotion
                                                SET produit.prix_ttc_p = ((produit.prix_ht_p*(100 - promotion.taux)/100)*(1+(produit.tva_p/100)) )
                                                        WHERE promotion.id_promo = produit.id_promo;
                        END;
                        //
delimiter ;
 
 
Erreur : ERROR 1442 (HY000): Can't update table 'produit' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. 
 
mysql> DESC produit;
+---------------+--------------+------+-----+---------+----------------+
| FIELD         | TYPE         | NULL | KEY | DEFAULT | Extra          |
+---------------+--------------+------+-----+---------+----------------+
| id_p          | INT(11)      | NO   | PRI | NULL    | AUTO_INCREMENT |
| ref_p         | INT(11)      | NO   |     | NULL    |                |
| nom_p         | VARCHAR(100) | YES  |     | NULL    |                |
| tva_p         | FLOAT        | YES  |     | NULL    |                |
| prix_ht_p     | FLOAT        | YES  |     | NULL    |                |
| quantite_p    | INT(6)       | YES  |     | NULL    |                |
| marque_p      | VARCHAR(100) | YES  |     | NULL    |                |
| dimension_p   | VARCHAR(100) | YES  |     | NULL    |                |
| poid_p        | VARCHAR(100) | YES  |     | NULL    |                |
| img_p         | VARCHAR(100) | YES  |     | NULL    |                |
| designation_p | text         | YES  |     | NULL    |                |
| id_sc         | INT(11)      | YES  | MUL | NULL    |                |
| id_promo      | INT(10)      | YES  | MUL | NULL    |                |
| prix_ttc_p    | FLOAT        | YES  |     | NULL    |                |
+---------------+--------------+------+-----+---------+----------------+
14 ROWS IN SET (0.01 sec)
 
mysql> DESC promotion;
+----------+---------+------+-----+---------+----------------+
| FIELD    | TYPE    | NULL | KEY | DEFAULT | Extra          |
+----------+---------+------+-----+---------+----------------+
| id_promo | INT(11) | NO   | PRI | NULL    | AUTO_INCREMENT |
| taux     | FLOAT   | YES  |     | NULL    |                |
| date_deb | DATE    | YES  |     | NULL    |                |
| date_fin | DATE    | YES  |     | NULL    |                |
+----------+---------+------+-----+---------+----------------+
4 ROWS IN SET (0.01 sec) 

2 réponses

galled Messages postés 41 Date d'inscription vendredi 30 octobre 2009 Statut Membre Dernière intervention 13 décembre 2012
2 déc. 2011 à 15:01
Bonjour,

Je n'ai pas la réponse pour toi, mais j'ai l'impression que ton problème viens du fait que tu fais avant un trigger sur update produit et tu update produit c'est pas comme une boucle à l'infini ça?

Et je ne suis pas sûr que ce soit judicieux de modifier le prix de ton produit du fait qu'on lui applique une promotion. il vaut peut-être mieux calculer le prix à chaque fois en prenant en compte qu'il y a une promotion ou non.

Sinon, il faut trouver une autre technique pour ton trigger.

Bonne chance.
0
noxa03 Messages postés 5 Date d'inscription dimanche 24 mai 2009 Statut Membre Dernière intervention 2 décembre 2011
2 déc. 2011 à 15:41
Bonjour,

Merci de ta réponse galled,effectivement j'ai trouvé voici mon trigger :

delimiter //
CREATE TRIGGER TTC_PROMO_UPDATE
BEFORE UPDATE ON produit 
FOR EACH ROW
BEGIN
IF new.id_promo <> old.id_promo

SET new.prix_ttc_p ((old.prix_ht_p*(100 - (SELECT taux FROM promotion,produit WHERE promotion.id_promo produit.id_promo AND produit.ref_p = new.ref_p))/100)*(1+(produit.tva_p/100)) )
WHERE promotion.id_promo produit.id_promo AND produit.ref_p new.ref_p; 
END IF;
END;
//
delimiter ;
0