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 :

INSERT et violation de contrainte Unique Key


Sujet :

SQL Oracle

  1. #1
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut INSERT et violation de contrainte Unique Key
    Bonjour,

    je tente d'insérer dans une table des données en utilisant le SQL suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO TABLE1 (VAL1, VAL2) VALUES (6.0,232.0);
    --Ligne 2
    INSERT INTO TABLE1  (VAL1, VAL2) VALUES (13.0,232.0);
    --Ligne 3
    INSERT INTO TABLE1  (VAL1, VAL2) VALUES (20.0,232.0);
    La table de destination ne contient que les champs VAL1 et VAL2, de type NUMBER(38,0), pas de PK (il s'agit d'une table de liaison).

    Mes INSERT ne passent pas à cause d'une violation de contrainte unique
    Erreur commençant à la ligne 8 de la commande :
    INSERT INTO TABLE1 (VAL1, VAL2) VALUES (13.0,232.0)
    Rapport d'erreur :
    Erreur SQL : ORA-00001: violation de contrainte unique (TABLE1)
    00001. 00000 - "unique constraint (%s.%s) violated"
    *Cause: An UPDATE or INSERT statement attempted to insert a duplicate key.
    For Trusted Oracle configured in DBMS MAC mode, you may see
    this message if a duplicate entry exists at a different level.
    *Action: Either remove the unique restriction or do not insert the key.
    Seul le premier INSERT est inséré.
    Ce que je ne comprends pas puisque je suis absolument certain que les données que j'essaye d'insérer n'existent pas dans TABLE1.

    Qu'est ce qui peut expliquer ce "phénomène" ?

    D'avance merci pour vos conseils

  2. #2
    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 386
    Points
    18 386
    Par défaut
    Vous avez une contrainte d'unicité ou un index unique sur la colonne val2.

    Regardez le script de création de votre table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select dbms_metadata.get_ddl('TABLE', 'TABLE1')
      from dual;

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    DBMS_METADATA.GET_DDL ne remontera pas l'index unique, regardez dans all_indexes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select index_name, uniqueness from all_indexes where table_name='TABLE1';
    Par ailleurs les tables de relation ont des PK.

  4. #4
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    @Waldar : merci pour la réponse.

    Le résultat de la requête :
    "
    CREATE TABLE "SC"."REFERENCE_LIEU"
    ( "REFERENCE" NUMBER(*,0) NOT NULL ENABLE,
    "LIEU" NUMBER(*,0) NOT NULL ENABLE,
    CONSTRAINT "REFERENCE_LIEU_UN" UNIQUE ("REFERENCE")
    USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "USERS" ENABLE,
    CONSTRAINT "REFERENCE_LIEU_LIEU_FK" FOREIGN KEY ("LIEU")
    REFERENCES "SC"."LIEU_MESURE" ("IDENTIFIANT") ENABLE,
    CONSTRAINT "REFERENCE_LIEU_REFERENCE_FK" FOREIGN KEY ("REFERENCE")
    REFERENCES "SC"."REFERENCE" ("IDENTIFIANT") ENABLE
    ) SEGMENT CREATION IMMEDIATE
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
    PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
    TABLESPACE "USERS"
    "
    Edit : et le résultat de la demande de skuatamad:
    REFERENCE_LIEU_IDX NONUNIQUE
    REFERENCE_LIEU_UN UNIQUE

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT "REFERENCE_LIEU_UN" UNIQUE ("REFERENCE")
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from REFERENCE_LIEU where REFERENCE = 13

  6. #6
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from REFERENCE_LIEU where REFERENCE = 13
    Aucun résultat.
    C'est bien ce qui m'étonne

    Je ne connais pas bien Oracle, je me demandais si ce n'était pas un pb de séquence.

  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 386
    Points
    18 386
    Par défaut
    Il faudrait voir les vraies commandes que vous avez passées, parce que nous ne savons pas ce que vous avez mis dans VAL1 ou VAL2 dans le premier sujet.

  8. #8
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Pour situer le contexte :
    - la BDD est celle d'un outil en cours de dév
    - par conséquent, je vais ajouter ou modifier des éléments à la mano dans la BD via SQLDeveloper.

    Les requêtes réelles passées sont les suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO REFERENCE_LIEU (LIEU, REFERENCE) VALUES (6.0,232.0);
    --Ligne 2
    INSERT INTO REFERENCE_LIEU (LIEU, REFERENCE) VALUES (13.0,232.0);
    --Ligne 3
    INSERT INTO REFERENCE_LIEU (LIEU, REFERENCE) VALUES (20.0,232.0);
    Les valeurs sont réellement celles que j'ai dans mon script.

    La valeur "232" existe bien dans la table REFERENCE
    les valeurs "6", "13" et "20" existent bien dans la tablea LIEU
    J'ai déjà des enregistrements dans la table REFERENCE_LIEU dont:
    REFERENCE | LIEU
    --------------------
    200 |6
    200 |13
    200 |20
    224 |6
    224 |20
    224 |13

  9. #9
    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 386
    Points
    18 386
    Par défaut
    Si la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select reference
        from REFERENCE_LIEU 
    group by reference
      having count(*) > 1;
    Ramène quelque chose, c'est que votre contrainte est en NOVALIDATE et/ou en DISABLE.
    D'après le GET_DDL elle est ENABLE, donc je pense pour le NOVALIDATE.

  10. #10
    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 386
    Points
    18 386
    Par défaut
    En fait je pense que votre contrainte a été mal créée.
    Dans les tables d'association, c'est le couple qui doit être unique.

    Il faudrait passer les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE sc.REFERENCE_LIEU
     DROP CONSTRAINT REFERENCE_LIEU_UN;
     
    ALTER TABLE sc.REFERENCE_LIEU
      ADD CONSTRAINT REFERENCE_LIEU_PK
            PRIMARY KEY (REFERENCE, LIEU)
            USING INDEX;

  11. #11
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Si la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      select reference
        from REFERENCE_LIEU 
    group by reference
      having count(*) > 1;
    Aucune ligne retournée

    Citation Envoyé par Waldar Voir le message
    En fait je pense que votre contrainte a été mal créée.
    Dans les tables d'association, c'est le couple qui doit être unique.

    Il faudrait passer les commandes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ALTER TABLE sc.REFERENCE_LIEU
     DROP CONSTRAINT REFERENCE_LIEU_UN;
     
    ALTER TABLE sc.REFERENCE_LIEU
      ADD CONSTRAINT REFERENCE_LIEU_PK
            PRIMARY KEY (REFERENCE, LIEU)
            USING INDEX;
    Dans ce cas, comment expliquer que plusieurs enregistrements avec une même REFERENCE ou un même LIEU aient déjà pu être crées dans cette table ?

  12. #12
    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 386
    Points
    18 386
    Par défaut
    Il y a un problème de cohérence dans ce que vous nous racontez.
    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
    CREATE TABLE REFERENCE_LIEU
    ( reference number not null
    , lieu      number not null
    );
     
    insert into REFERENCE_LIEU (reference, lieu) values (200,  6);
    insert into REFERENCE_LIEU (reference, lieu) values (200, 13);
    insert into REFERENCE_LIEU (reference, lieu) values (200, 20);
    insert into REFERENCE_LIEU (reference, lieu) values (224,  6);
    insert into REFERENCE_LIEU (reference, lieu) values (224, 13);
    insert into REFERENCE_LIEU (reference, lieu) values (224, 20);
     
    commit;
     
      SELECT reference
        FROM REFERENCE_LIEU 
    GROUP BY reference
      HAVING count(*) > 1;
     
    REFERENCE
    ---------
    224
    200
     
      SELECT lieu
        FROM REFERENCE_LIEU 
    GROUP BY lieu
      HAVING count(*) > 1;
     
    LIEU
    ----
    6
    13
    20

  13. #13
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    @Waldar : merci pour votre réponse.
    En effet, en y regardant de plus près je n'ai pas deux fois la même REFERENCE dans la table.
    J'ai été induit en erreur par le dév qui a créé la table.
    La contrainte unique ne porte en fait que sur cette colonne et devrait en fait se faire sur la paire REFERENCE - SITE.

  14. #14
    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 386
    Points
    18 386
    Par défaut
    Ah les vilains développeurs !

    On a le tenant de l'histoire.
    Il ne reste plus qu'à l'aboutir, avec les deux commandes que j'ai publiées un peu plus haut.

  15. #15
    Modérateur

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2007
    Messages
    1 996
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 996
    Points : 3 102
    Points
    3 102
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ah les vilains développeurs !
    C'est vrai, ne jamais leur faire confiance

    Quoi qu'il en soit merci pour le temps passé sur ce sujet

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

Discussions similaires

  1. Lenteur lors de Violation de la contrainte UNIQUE KEY
    Par ludo00002 dans le forum Firebird
    Réponses: 5
    Dernier message: 23/05/2012, 23h12
  2. Error ORA-00001: violation de contrainte unique
    Par delilou dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 17/03/2011, 17h26
  3. violation de contrainte unique (KOLOK.IDCONFIG_PK)
    Par Sephiroth Lune dans le forum Administration
    Réponses: 12
    Dernier message: 20/04/2007, 11h51
  4. [hibernate] Violation de contrainte unique
    Par miyabi dans le forum Hibernate
    Réponses: 1
    Dernier message: 07/06/2006, 14h52
  5. Réponses: 2
    Dernier message: 13/02/2006, 11h13

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