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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    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 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    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).
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    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
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    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 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    Par défaut
    Quelle est votre version d'Oracle ?

  6. #6
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 45
    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 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 454
    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

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

Discussions similaires

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

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