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 :

pb insert dans trigger


Sujet :

SQL Procédural MySQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 121
    Par défaut pb insert dans trigger
    bonjour,

    dans Mysql, j'ai 2 table t1 et t2 avec une contrainte entre les deux : je ne peux pas ajouter de ligne à T2 si la ligne avec le bon rowid n'existe pas dans T1

    dans un trigger je fais un insert dans T1 puis un insert dans T2 et la j'ai une erreur ( à cause de la contrainte) qui me dit que je peux faire d'insert dans T2 car la ligne n'existe pas dans T1... alors que je viens de l'insérer.
    j'ai pensé faire un commit, mais c'est interdit dans les triggers....

    ma base est en innodb

    je vois pas comment m'en sortir ?????

    si quelqu'un à une idée merci d'avance

  2. #2
    Membre chevronné
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    Si vous avez une erreur c'est que votre insert dans t2 n'est pas fait correctement. Une fois l'insert fait dans t1, vous devez récupérer l'id avec LAST_INSERT_ID() si votre id est en autoincrement et insérer sa valeur dans l'insert de t2.

    ++

  3. #3
    Membre chevronné
    Avatar de tse_jc
    Homme Profil pro
    Data Solutions
    Inscrit en
    Août 2010
    Messages
    287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Data Solutions
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2010
    Messages : 287
    Billets dans le blog
    4
    Par défaut
    Ce que je viens de vous dire est la méthode classique.
    Cependant un truc me chiffonne. Pourquoi passer par un trigger pour faire ceci?

    Je m'explique
    1) Soit votre trigger se déclenche sur une action effectuée sur une 3e table, et dans ce cas, ce que je viens de vous dire a tout son sens
    2) Soit votre trigger se déclenche sur un AFTER INSERT sur votre table t1, auquel cas il vous suffit juste dans votre trigger de faire l'insert sur t2 à l'aide du NEW.id de la table t1.

    Cordialement,

    Jc.

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 121
    Par défaut
    merci pour votre réponse.
    mon cas est le 2)

    alors je viens de basculer le trigger en procédure pour pouvoir ajouter des start transaction/commit

    j'ai toujours le même pb à l'insertion dans T2:
    cannot add or update à child row: a foreign key constraint fails (base/t2, constraint 'toto' FOREIGN KEY (fk_id) REFERENCES T1 (rowid).....

    j'ai du mal à comprendre. quand je sors l'insert de la procédure et que je l’exécute depuis l’éditeur ça marche........

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Postez le code de votre trigger, ce sera plus facile de détecter ce qui ne va pas.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Par défaut
    C'est bien un trigger AFTER INSERT et non BEFORE INSERT ?

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 121
    Par défaut
    j'ai viré le trigger et tout mis dans un prodédure que je lance moi même. j'ai essayé d'ajouter des start transaction/commit rien n'y change

    la procédure:

    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
    SET @propal_ref='eee';
    set @fk_soc=2;
    set @fk_projet=0;
    set @fk_propal=num_fk_propale; :*/parametre de la procedure/*
    set @id=(select max(rowid)+1 from llx_commande); /* rowid de la ligne commande*/
     
     /* a inserer dans llx_commande*/
    start transaction;
    insert into llx_commande (ref,entity,ref_ext,ref_int,ref_client,fk_soc,fk_projet,tms,date_creation,date_commande,fk_user_author,fk_statut,remise_percent,remise_absolue,remise,tva,localtax1,localtax2,total_ht,total_ttc,note,note_public,model_pdf,facture,fk_account,fk_currency,fk_cond_reglement,fk_mode_reglement,date_livraison,fk_availability,fk_demand_reason,fk_adresse_livraison,fk_propale)
                select concat('(Prov', @id ,')'),entity,ref_ext,ref_int,concat(ref_client,' ',@propal_ref),fk_soc,fk_projet,now(),now(),now(),1,0,remise_percent,remise_absolue,remise,tva,localtax1,localtax2,total_ht,total,concat(note,' ref propal :',@propal_ref),note_public,'einstein',0,fk_account,fk_currency,fk_cond_reglement,fk_mode_reglement,date_livraison,fk_availability,fk_demand_reason,fk_adresse_livraison,@fk_propal from `llx_propal` where rowid=@fk_propal;
                commit;
     
    /* a inserer dans llx_commandedet     */
    start transaction;
    insert into llx_commandedet (fk_commande,fk_product,description,tva_tx,localtax1_tx,localtax2_tx,qty ,remise_percent,  remise ,fk_remise_except,price,subprice,total_ht,total_tva,total_localtax1,total_localtax2,total_ttc,product_type, info_bits,special_code, rang)  select   @id , fk_product,description,tva_tx,localtax1_tx,localtax2_tx,qty ,remise_percent,  remise ,fk_remise_except,price,subprice,total_ht,total_tva,total_localtax1,total_localtax2,total_ttc,product_type, info_bits,special_code, rang    from llx_propaldet where fk_propal= @fk_propal ;
            	commit;
    le premier insert fronctionne.
    le deuxieme me renvoi l'erreur en piece jointe erreur.jpg
    j'ai ajouté la contrainte en piece jointe aussi (j'ai essayé de changer le mode restric en no_action sur l'update mais pas de chgt)
    si j'exécute le deuxieme insert dans l'éditeur sql ca marche

    par contre un truc: si j’arrête/redemarre Mysql , la procédure fonctionne... ensuite je supprime les ligne insérée, je relance la procedure: a nouveau l'erreur.....
    Images attachées Images attachées   

  8. #8
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 121
    Par défaut
    quand j’enlève la contrainte ça fonctionne .... mais c'est pas la solution

  9. #9
    Membre Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    voilà ton code reformaté pour être plus lisible:
    Code sql : 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
    SET @propal_ref='eee';
    SET @fk_soc=2;
    SET @fk_projet=0;
    SET @fk_propal=num_fk_propale; :*/parametre de la procedure/*
    set @id=(select max(rowid)+1 from llx_commande); /* rowid de la ligne commande*/
     
     /* a inserer dans llx_commande*/
    start transaction;
    INSERT INTO llx_commande
    	(ref,entity,ref_ext,ref_int,ref_client,
    	fk_soc,fk_projet,tms,date_creation,date_commande,fk_user_author,fk_statut,
    	remise_percent,remise_absolue,remise,tva,localtax1,localtax2,
    	total_ht,total_ttc,note,note_public,
    	model_pdf,facture,fk_account,fk_currency,fk_cond_reglement,fk_mode_reglement,date_livraison,
    	fk_availability,fk_demand_reason,fk_adresse_livraison,fk_propale)
    SELECT
    	concat('(Prov', @id ,')'),entity,ref_ext,ref_int,concat(ref_client,' ',@propal_ref),
    	fk_soc,fk_projet,now(),now(),now(),1,0,
    	remise_percent,remise_absolue,remise,tva,localtax1,localtax2,
    	total_ht,total,concat(note,' ref propal :',@propal_ref),note_public,
    	'einstein',0,fk_account,fk_currency,fk_cond_reglement,fk_mode_reglement,date_livraison,
    	fk_availability,fk_demand_reason,fk_adresse_livraison,@fk_propal
    FROM `llx_propal` WHERE rowid=@fk_propal;
    commit;
     
    /* a inserer dans llx_commandedet     */
    start transaction;
    INSERT INTO llx_commandedet
    	(fk_commande,fk_product,description,tva_tx,localtax1_tx,localtax2_tx,qty ,
    	remise_percent,  remise ,fk_remise_except,price,subprice,
    	total_ht,total_tva,total_localtax1,total_localtax2,total_ttc,product_type, info_bits,special_code, rang)
    SELECT
    	@id , fk_product,description,tva_tx,localtax1_tx,localtax2_tx,qty ,
    	remise_percent,  remise ,fk_remise_except,price,subprice,
    	total_ht,total_tva,total_localtax1,total_localtax2,total_ttc,product_type, info_bits,special_code, rang
    FROM llx_propaldet WHERE fk_propal= @fk_propal ;
    commit;
    il aurait été bien de voir tout le code de la procédure (entête + corps complets)
    étant donné que tu as utilisé des variables globales dont certaines qui sont utilisées comme @id, qui est pourtant commenté... l'erreur peut venir de là...

    pour les commentaires, utilises plutôt "#" ou "-- " en début de ligne ç a évite ce genre de confusion ou de loupés... et tu es sur que seul la fin de ligne est concernée

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2012
    Messages
    121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Mars 2012
    Messages : 121
    Par défaut
    Citation Envoyé par manbar Voir le message
    j'ai trouvé.....

    j'ai remplacé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    set @id=(select max(rowid)+1 from llx_commande); 
    par 
    set @id=(select rowid from `llx_commande` where fk_propale=@fk_propal );
    et il ya avait aussi un pb de transaction géré dans l'appli web qui du coup me faisait perdre le fil.....

    merci!

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

Discussions similaires

  1. Trigger d'insertion dans une nouvelle table
    Par Marty000 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/10/2006, 17h24
  2. Réponses: 9
    Dernier message: 20/10/2006, 14h32
  3. Réponses: 1
    Dernier message: 02/06/2006, 11h54
  4. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55
  5. Annuler une insertion dans un Trigger
    Par dreamanoir dans le forum Oracle
    Réponses: 2
    Dernier message: 10/01/2005, 13h04

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