Erreur SQL 1442, Requete UPDATE ne marche pas

Messages postés
5
Date d'inscription
dimanche 24 mai 2009
Statut
Membre
Dernière intervention
2 décembre 2011
- - Dernière réponse : 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) 
Afficher la suite 

2 réponses

Messages postés
41
Date d'inscription
vendredi 30 octobre 2009
Statut
Membre
Dernière intervention
13 décembre 2012
0
Merci
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.
Commenter la réponse de galled
Messages postés
5
Date d'inscription
dimanche 24 mai 2009
Statut
Membre
Dernière intervention
2 décembre 2011
0
Merci
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 ;
Commenter la réponse de noxa03