IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Erreur SQL 1442, Requete UPDATE ne marche pas


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  2. #2
    Membre éclairé Avatar de GyZmoO
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    428
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    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 : 428
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 2
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ;

  4. #4
    Membre très actif
    Homme Profil pro
    Inscrit en
    Décembre 2004
    Messages
    174
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 174
    Par défaut
    Marque résolu

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique (Débutant)
    Inscrit en
    Avril 2011
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Développeur informatique (Débutant)
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2011
    Messages : 45
    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 :
    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 :
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Requête SQL UPDATE ne marche pas avec Mozilla
    Par souffirst dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/11/2008, 15h24
  2. [LINQ to SQL] Update qui marche pas
    Par zooffy dans le forum Accès aux données
    Réponses: 3
    Dernier message: 15/10/2008, 14h23
  3. pb de requete qui ne marche pas sur pl sql
    Par smartsorft dans le forum SQL
    Réponses: 6
    Dernier message: 15/01/2008, 15h14
  4. pas d'erreur mais update qui marche pas
    Par gloppy dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/12/2006, 15h49
  5. inner join pour requete update ne marche pas
    Par Garra dans le forum Requêtes
    Réponses: 4
    Dernier message: 25/01/2006, 13h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo