2010-12-03 9 views
7

Je crée une base de données qui tente d'accéder à des valeurs à partir d'une clé étrangère. J'ai créé deux tables suivantesErreur SQL: ORA-02291: contrainte d'intégrité

CREATE TABLE Component(
    ComponentID varchar2(9) PRIMARY KEY 
    , TypeID varchar2(9) REFERENCES TypeComponent(TypeComponentID) 
) 

INSERT INTO Component VALUES(192359823,785404309) 
INSERT INTO Component VALUES(192359347,785404574) 
INSERT INTO Component VALUES(192359467,785404769) 
INSERT INTO Component VALUES(192359845,785404867) 
INSERT INTO Component VALUES(192359303,785404201) 
INSERT INTO Component VALUES(192359942,785404675) 


CREATE TABLE TypeComponent (
    TypeComponentID varchar2(9) PRIMARY KEY 
    , Type_Description varchar2(30) CONSTRAINT Type_Description 
     CHECK(Type_Description IN('Strap', 'Buckle', 'Stud')) NOT NULL 
) 

INSERT INTO TypeComponent VALUES(785404309, 'Strap') 
INSERT INTO TypeComponent VALUES(785404574, 'Stud') 
INSERT INTO TypeComponent VALUES(785404769, 'Buckle') 
INSERT INTO TypeComponent VALUES(785404867, 'Strap') 
INSERT INTO TypeComponent VALUES(785404201, 'Buckle') 
INSERT INTO TypeComponent VALUES(785404675, 'Stud') 

Ce sont les deux tables. et TypeComponent. Component est l'entité mère à TypeComponent, et je suis en train d'exécuter l'instruction INSERT suivante:

INSERT INTO Component VALUES(192359823,785404309) 

mais il me donne l'erreur

Ceci est la session que j'ai jusqu'à présent dans Oracle SQL dev

+0

Pouvez-vous s'il vous plaît poster toute votre session et reformater votre message un peu? –

+0

Chaque fois que vous entrez des instructions SQL et des journaux d'erreurs, sélectionnez les instructions et cliquez sur Code (c'est-à-dire, icône avec '1010' pour qu'il soit lisible) – Sathya

Répondre

6

Essayez d'insérer dans votre première table TypeComponent, puis insérez dans votre table Component.

Selon l'erreur:

ORA-02291:    integrity constraint (string.string) violated - parent key not found
Cause:            A foreign key value has no matching primary key value.
Action:            Delete the foreign key or add a matching primary key.

Cela signifie qu'il n'y a pas de clé correspondante dans votre table référencée.

EDIT # 1

Pour votre information genre, voici un site où vous pouvez obtenir de l'aide avec tous les codes d'erreur Oracle.

http://[ora-02291].ora-code.com/

est ici la page d'accueil de ce site: http://www.ora-code.com/

Si vous pouvez remplacer le code d'erreur dans l'URL pour convenir le code d'erreur que vous obtenez, et vous aurez accès à la page pour cette erreur.

+0

Donc, vous dites que je devrais supprimer les deux tables, puis CREATE la table TypeComponent d'abord, puis insérer l'instruction dans la table Component? – David

+0

Idéalement, Dans votre scénario, 'Component' dépend de' TypeComponent', j'aime le penser comme un objet atomique, il peut exister par lui-même, d'un autre côté, 'Component' ne peut pas exister. sans 'TypeComponent', puisque son champ' TypeID' fait référence à la clé primaire de la table 'TypeComponent' .Ainsi, lors de l'insertion dans' Component', le moteur de base de données vérifie la référence que vous lui donnez, La valeur de 'TypeComponent.TypeComponentID', et comme il ne peut pas le trouver, il rejette l'insertion, sinon vous auriez un problème d'intégrité des données. –

+0

Je ne pense pas que l'ordre de création de table soit un problème ici, puisque vous avez dit qu'ils existent tous les deux dans votre base de données. En outre, cela aurait peut-être rendu évident si vous aviez créé la table 'TypeComponent' avant le' Component', qu'une ligne doit exister dans 'TypeComponent' pour être insérée dans' Component'. –

2

Veuillez poster toute votre session SQLPLUS pour que l'erreur soit facilement reproductible.

On dirait que l'insertion dans la table enfant est en cours avant l'insertion dans la table parente qui provoque cette erreur.

Modifiez l'ordre des insertions et réexécutez votre code.

SQL> CREATE TABLE TypeComponent(
    2 TypeComponentID varchar2(9) PRIMARY KEY, 
    3 Type_Description  varchar2(30) 
    4 CONSTRAINT Type_Description CHECK(Type_Description IN('Strap', 'Buckle', 'Stud')) NOT NULL 
    5 ) 
    6 ; 

Table created. 

SQL> CREATE TABLE Component(
    2 ComponentID varchar2(9) PRIMARY KEY, 
    3 TypeID varchar2(9) REFERENCES TypeComponent(TypeComponentID) 
    4 ) 
    5 ; 

Table created. 

SQL> INSERT INTO Component VALUES(192359823,785404309); 
INSERT INTO Component VALUES(192359823,785404309) 
* 
ERROR at line 1: 
ORA-02291: integrity constraint (COAMGR.SYS_C002513823) violated - parent key 
not found 

SQL> INSERT INTO TypeComponent VALUES(785404309, 'Strap'); 

1 row created. 

SQL> INSERT INTO Component VALUES(192359823,785404309); 

1 row created. 

SQL> commit; 

Commit complete. 
1

Dans le tableau component vous avez

TypeID REFERENCES TypeComponent(TypeComponentID) 

Et puis vous poursuivez

INSERT INTO Component VALUES(192359823,785404309) 

Si vous avez exécuté cette première, puis Oracle lancera Integrity constraint erreur parce que vous essayez d'insérer dans component table une valeur qui n'est pas présente dans le tableau TypeComponent.

Ceci est un problème parce que vous avez mentionné que TypeID est une clé étrangère, à savoir la valeur de TypeID doit être présent dans TypeComponent avant de l'insérer dans Component

+3

Veuillez noter une règle générale ici: lors du remplissage des référence * données d'abord (donc composant * type * est données de référence), puis données principales – araqnid

1

Cette erreur est présente quelques fois avec la clé référencée (clé étrangère dans mon cas) cela comporte des erreurs. Veuillez recréer la clé référencée dans la table.