2009-09-21 5 views
1

J'ai une table:ORA-02437: ne peut pas valider <name> - clé primaire violé

CREATE TABLE MY_TABLE (
    MY_ID NUMBER NOT NULL, 
    COLUMN_1 NUMBER, 
    COLUMN_2 NUMBER 
); 
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID); 

à un moment plus tard, lors de l'exécution SQL suivante, je reçois une erreur:

ALTER TABLE MY_TABLE DROP PRIMARY KEY DROP INDEX; 
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID) 

ORA-02437: cannot validate PK_FOO - primary key violated 

Mon La table contient seulement 3 entrées toutes avec une clé primaire différente qui n'est pas non plus nulle. Quelqu'un a une idée de ce que cela pourrait être?

Merci,

Peter

+0

Pourriez-vous poster vos instructions CREATE TABLE/INSERTS afin que nous puissions reproduire votre cas? –

Répondre

0

a 2 clés primaires identiques?

Cette erreur est généralement levée lorsque vous essayez de créer/activer une clé primaire sur une table

+0

Comme je l'ai déjà écrit ... la table contient 3 * valeurs *, * non-null * différentes pour la clé primaire. – blackicecube

1

de here

Cause: You tried to tried to enable a primary key constraint, but the columns in the primary key either contained NULL values or duplicates..

+0

Comme je l'ai déjà écrit ... la table contient 3 * valeurs *, * non-null * différentes pour la clé primaire. – blackicecube

+0

puis-je demander, quelles sont ces valeurs de clé primaire? – Aziz

+0

Voilà ma définition de la table: Nom de la colonne Type de données Nullable colonne Id PK mon_id \t NUMÉRO No 1 1 COLUMN_2 Oui NUMÉRO 2 \t COLUMN_3 Oui NUMÉRO 3 – blackicecube

6

Vous devez pardonner à un certain scepticisme de notre part. Parce que cette erreur indique définitivement une valeur en double.

Ce que vous devez faire est d'utiliser la clause exceptions. Cela vous montrera les ROWID des enregistrements qui violent votre contrainte. Vous devrez peut-être créer la table cible: par défaut, le script crée une table appelée EXCEPTIONS:

SQL> ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID); 
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID) 
            * 
ERROR at line 1: 
ORA-02437: cannot validate (APC.PK_FOO) - primary key violated 


SQL> @%ORACLE_HOME%\rdbms\admin\utlexpt1.sql 

Table created. 

SQL> ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID) 
    2 exceptions into exceptions 
    3/
ALTER TABLE MY_TABLE ADD CONSTRAINT PK_FOO PRIMARY KEY (MY_ID) 
            * 
ERROR at line 1: 
ORA-02437: cannot validate (APC.PK_FOO) - primary key violated 


SQL> select * from exceptions 
    2/

ROW_ID    OWNER TABLE_NAME CONSTRAINT 
------    ----- ---------- ---------- 
AABQXcAAEAAAXUPAAD APC MY_TABLE PK_FOO   
AABQXcAAEAAAXUPAAB APC MY_TABLE PK_FOO   

SQL> 

Modifier

Vous devez comprendre ce qui est différent entre votre code installation et la simplification que vous avez publié ici. Les chances sont que vous avez une ou plusieurs instructions INSERT qui sont exécutées accidentellement plus d'une fois alors que la contrainte n'est pas en vigueur. L'ajout de la clause EXCEPTIONS INTO à votre code peut vous aider à le retrouver.

+0

Merci, je vais l'essayer ... Malheureusement, je n'ai pas pu reproduire le problème en exécutant simplement ces quelques fragments de sql L'erreur se produit seulement dans le cadre d'une grande procédure d'installation où ces lignes sont exécutées – blackicecube

+1

+1 ...sympa de se souvenir de cette fonctionnalité Oracle – dpbradley

0

Je suis upvoting la réponse de l'APC, mais puisque vous semblez avoir des problèmes sa mise en œuvre, pourriez-vous juste après les résultats de cette requête:

select my_id, count(*) from my_table group by my_id having count(*) >1 

Cela nous donnera (et vous) une idée de les clés problématiques.

+0

sélectionnez my_id, count (*) de my_table group par my_id ayant le compte (*)> 1 ne renvoie aucune ligne. sélectionnez my_id, count (*) de my_table group par my_id retourne 3 lignes avec 3 identifiants différents et compte = 1. – blackicecube

+0

OK - Je vois maintenant avec les commentaires supplémentaires que cela se passe dans le cadre d'un processus plus complexe - je pensais vous auriez accès à la table avec les lignes incriminées avant que la contrainte ne soit appliquée. – dpbradley

Questions connexes