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 Oracle Discussion :

Requete d'insertion : constraint violated


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut Requete d'insertion : constraint violated
    Bonjour,
    j'essaye d'insérer des données dans une table A par l'intermédiaire d'une requète SQL insert into.
    Cette table A contient 2 champs (idA - idB) qui composent la clé unique. le 1er est l'id de l'enreg dans la table A, l'autre est l'id externe d'une table B
    La table B contient 2 champs également (idB - ValB). le 1er est l'id de l'enreg dans la table B, l'autre est une valeur.

    Pour un certain nombre d'enreg (ceux dont idB like '%PRE'), je souhaite insérer dans la table A qui contient (idA - idB), un deuxième enreg (idA - ValB) en requétant la table B

    Comme tout ne va pas toujours de façon idéale, la table A contient des enreg parasites qui sont déjà au format (idA - ValB) et donc quand j'essaye de transformer (idA - idB) en ajoutant dans A (idA - ValB) => constraint violated .... Logique .....

    pour résumer intialement
    table A table B
    idA1 idB1 idB1 valB1
    idA2 idB2 idB2 valB2
    idA3 idB3 idB3 valB3
    idA4 idB4 idB4 valB4
    idA4 ValB5 idB5 valB5

    a l'issue des insert, je veux avoir ...
    table A
    idA1 idB1
    idA2 idB2
    idA3 idB3
    idA4 idB4
    idA1 ValB1
    idA2 ValB2
    idA3 ValB3
    idA4 ValB4
    idA4 ValB5

    Y a-t-il une solution pour forcer sqlplus à continuer l'exécution de la ligne insert into malgré les potentielles constraint violated ou faut-il faire tout autrement ... ?

    Désolé, c'est pas facile à expliquer simplement ...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 118
    Points : 28 503
    Points
    28 503
    Par défaut
    S'agit-il d'une requête INSERT ... SELECT ou d'une requête INSERT ... VALUES ?
    Dans le premier cas, c'est très simple : il suffit d'ajouter une clause WHERE NOT EXISTS...
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO matable
        (   cle
        ,   valeurs
        )
    SELECT  src.cle
        ,   src.valeurs
    FROM    marequete   AS src
    WHERE   NOT EXISTS
            (   SELECT  1
                FROM    matable AS tgt
                WHERE   tgt.cle = src.cle
            )
    ;
    Dans le second cas, il faut transformer la requête INSERT-VALUES en INSERT-SELECT en utilisant une table à ligne unique (DUAL ou équivalente).

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Si j'ai bien suivi, votre modèle est catastrophique !

    Dans la tableA, le champ idB peut donc recevoir soit des idB, soit des valB ?

    Il faut la description exacte de vos tables.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    C'est une insert into et j'étais parti comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    insert into A(valB, idA)
    select B.ValB,A.idA
    from A,B
    where A.idA in
    (select idA from A where idB like '%_PRE') 
    and 
    B.idB in
    (select idB from A where idB like '%_PRE') 
    and 
    B.id_presentation = A.id_doc
    et je ne vois pas comment rédiger la clause Where not exists ....

    PS : oui mon modèle est cata mais j'en hérite sans pouvoir le changer .... et sinon, c'est bien ça, il y a des des idB et des valB mélangés ... En fait c'est un bug dans un prog qui a conduit à mettre les mauvaises valeurs ... on a patché le bug et maintenant il faut remettre la base d'aplomb en prod avec les moyens du bord ...

    PS2 :
    table A : idA varchar(40 Byte) et idB varchar(40 Byte)
    table B : idB varchar(440 Byte) et valB varchar(50 Byte)

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Quelle est votre version d'Oracle ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    oracle version 10.2.0.1.0

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Regardez peut-être du côté de MERGE alors, ça insérera les nouvelles lignes et fera des mises à jour sur les anciennes :
    http://download.oracle.com/docs/cd/B...htm#SQLRF01606

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Mouais .... bon ben merci à vous mais je ne m'en sors pas ....
    Manque de compétences sans aucun doute ....
    Je ne vois toujours pas comment rédiger la clause Where not exists et je ne comprends pas comment je pourrais faire avec le merge ....

  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 118
    Points : 28 503
    Points
    28 503
    Par défaut
    Si ta ligne est refusée à l'insertion, c'est bien pour un problème de DUPLICATE KEY ?
    Reprends le modèle que je t'ai donné et remplace les clé, valeur et autre matable par les noms de colonne et de table qui vont bien.

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    Merci de votre patience.
    je dois être vraiment bête mais ma requète donne :
    insert into RACCOURCIS(id_doc, id_user)
    SELECT src.id_document, src.id_user
    FROM RACCOURCIS
    INNER JOIN PRESENTATION
    ON RACCOURCIS.id_doc = PRESENTATION.id_presentation
    where RACCOURCIS.id_doc like '%_PRE' as src
    where not exists (select 1 from RACCOURCIS as tgt where tgt.id_user=src.id_user)
    et en faisant ça j'obtiens : ORA-00933 SQL command not properly ended Error at line 7 column 38
    soit juste après le AS .....

  11. #11
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Vous utilisez l'alias src mais vous l'avez mal affecté !
    Au passage, pas de "AS" pour les alias de table avec Oracle.

    Essayez ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    INSERT into RACCOURCIS (id_doc, id_user)
    SELECT
        pr.id_document,
        rc.id_user 
    FROM
        RACCOURCIS rc
        INNER JOIN PRESENTATION pr
          ON pr.id_presentation = rc.id_doc
    where
        rc.id_doc like '%_PRE'
    and not exists (select null from RACCOURCIS tgt
                    where tgt.id_user =s rc.id_user)

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    Points : 30
    Points
    30
    Par défaut
    merci beaucoup pour votre aide et votre patience à tout ceux qui m'ont répondu : ça marche
    En mixant vos conseils, j'arrive à mon résultat

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/03/2012, 15h09
  2. Réponses: 1
    Dernier message: 26/11/2010, 12h34
  3. [PB] requete d'insertion avec group by
    Par warraf dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/11/2005, 08h01
  4. Probleme de requete d insertion
    Par donny dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 08/07/2005, 18h59
  5. [excel > sql] effectuer requete d'insertion
    Par kiki93 dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/02/2005, 16h30

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