Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/12/2011, 20h13   #1
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2011
Messages : 2
Points : 0
Points : 0
Par défaut Erreur SQL 1442, Requete UPDATE ne marche pas

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.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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)
noxa02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 11h11   #2
Membre confirmé
 
Avatar de GyZmoO
 
Homme Mickaël
Ingénieur développement logiciels
Inscription : février 2006
Messages : 402
Détails du profil
Informations personnelles :
Nom : Homme Mickaël
Âge : 27
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : février 2006
Messages : 402
Points : 238
Points : 238
Envoyer un message via MSN à GyZmoO
Salut et bienvenue sur le forum !

Le message de MySQL te dit simplement que tu ne peux pas faire d'update sur la table sur laquelle est définie le trigger.

Pour contourner cette limitation, il faut que tu utilises 'NEW', dans ton cas, ça donnerait un truc de ce style :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
delimiter //
CREATE TRIGGER TTC_PROMO_UPDATE
  BEFORE UPDATE ON produit
    FOR EACH ROW
      BEGIN
        DECLARE tauxPromotion FLOAT DEFAULT 0;
        DECLARE idPromotion INTEGER DEFAULT 0;
 
        SELECT promo.taux, promo.id_promo  INTO tauxPromotion, idPromotion FROM promotion promo WHERE promo.id_promo = NEW.id_promo;
 
        IF (NEW.id_promo = idPromotion)
          SET NEW.prix_ttc_p = ((NEW.prix_ht_p*(100 - tauxPromotion)/100)*(1+(NEW.tva_p/100)) )
      END;
//
delimiter ;
J'ai pas testé, mais ça devrait être assez proche j'espère de la solution !

Bon courage
__________________
define: Programmeur : Celui qui résout un problème que vous n'aviez pas, d'une façon que vous ne comprenez pas.
GyZmoO est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/12/2011, 13h02   #3
Invité de passage
 
Homme
Inscription : décembre 2011
Messages : 2
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : décembre 2011
Messages : 2
Points : 0
Points : 0
Bonjour GyZmoO,

Tout d'abors un grand merci à toi, tu m'as totalement éclairé sur la syntaxe du trigger entre deux tables, j'ai du faire quelques modifications pour qu'il marche mais c'est parfait. Merci beaucoup !

Pour ceux qui en auraient besoin un jour :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
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 ;
noxa02 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/12/2011, 16h34   #4
Membre confirmé
 
Homme Arnaud
Inscription : décembre 2004
Messages : 167
Détails du profil
Informations personnelles :
Nom : Homme Arnaud
Âge : 40
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : décembre 2004
Messages : 167
Points : 238
Points : 238
Marque résolu
__________________
NginX, SphinxSearch Addict !!
lenono est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2012, 00h06   #5
Invité de passage
 
Homme NazOok
Étudiant
Inscription : avril 2011
Messages : 6
Détails du profil
Informations personnelles :
Nom : Homme NazOok
Localisation : France, Calvados (Basse Normandie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 6
Points : 4
Points : 4
Par défaut Problème trigger insert

Bonjour,

J'ai un problème un peu similaire mais c'est différent car j'utilise une procédure stockée et un trigger, j'explique mon cas :
Ma procédure me permet d'ajouter une ligne dans ma table Reservation, et mon trigger me permet d'incrementer le champ Reservation de ma table Reference à chaque ajout d'une ligne dans la table Reservation.
Mais cela ne fonctionne pas il me renvoi l'erreur : "Can't update table 'reference' in stored function/trigger becaused by statement which invoked this stored function/trigger."

Je pense que cette erreur survient lorsque je souhaite ajouter ma ligne car je demande le champ Reservation de la table Reference comme nouvel ID de ma nouvelle ligne.. non ?

Code Procédure :
Citation:
USE HOTEL;

DROP PROCEDURE IF EXISTS ReservationAjout;

CREATE PROCEDURE ReservationAjout (IN IDReservation int, IN IDClient int, IN IDChambre int, IN DateDebut date, IN DateFin date, OUT RetourVal int)
BEGIN

IF IDReservation = 0 Then
INSERT INTO Reservation (IDReservation , IDClient, IDChambre, DateDebut, DateFin) VALUES ((select Reservation from reference), IDClient, IDChambre, DateDebut, DateFin);
ELSE
INSERT INTO Reservation (IDReservation, IDClient, IDChambre, DateDebut, DateFin) VALUES (IDReservation, IDClient, IDChambre, DateDebut, DateFin);
END IF;

SET RetourVal = LAST_INSERT_ID();

END;
Code Trigger :
Citation:
CREATE TRIGGER `hotel`.`TrigReservation` AFTER INSERT
ON hotel.reservation FOR EACH ROW
BEGIN
UPDATE Reference SET Reference.Reservation=Reference.Reservation+1;
END;
Si quelqu'un pouvait m'aider ?
Si vous n'avez pas compris qqchose dite le moi

Merci beaucoup.
NazOok est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h01.


 
 
 
 
Partenaires

Hébergement Web