11
votes

Erreur SQL: ORA-02291: Contrainte d'intégrité

Je crée une base de données qui tente d'accéder aux valeurs d'une clé étrangère. J'ai créé deux tables suivantes xxx

Ce sont les deux tables. Composant et TYPECOMPONENT . composant est l'entité parent sur typecomponent , et j'essaie d'exécuter l'instruction insertion suivante: xxx

mais il me donne l'erreur

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


2 commentaires

Pouvez-vous s'il vous plaît poster votre session entière et reformater votre message un peu?


Chaque fois que vous entrez des instructions SQL et des journaux d'erreur, veuillez sélectionner les instructions et cliquer sur le code (c.-à-d. Icône avec 1010 afin qu'il soit lisible. Merci.


4 Réponses :


3
votes

Veuillez afficher votre session SQLPlus entière afin que l'erreur soit facilement reproductible.

On dirait que l'insert dans la table enfant est en cours de faire avant l'insertion dans la table des parents qui provoque cette erreur. P>

Modifiez l'ordre des insertions et retentissez votre code. P>

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.


0 commentaires

1
votes

in composant table que vous avez xxx

, puis vous continuez avec xxx

si vous avez exécuté ceci Tout d'abord, alors Oracle lancera la contrainte d'intégrité car vous essayez d'insérer dans composant Tableau une valeur qui n'est pas présente dans TypeComponent Tableau.

Ceci est un problème car vous avez mentionné que typeid est une clé étrangère, c'est-à-dire la valeur de typeid doit être présent dans Typecomponent avant d'insérer dans composant


1 commentaires

Il convient de souligner une règle générale ici: lorsque vous remplissez des données, peuplez les données référence (donc composant type est des données de référence), puis des données principales.



9
votes

Essayez d'insérer dans votre table Tableau d'abord, puis insérez dans votre composant Table.

Selon l'erreur:

ora-02291: Contraint d'intégrité (string.string) violé - clé parent non trouvée
Cause: Une valeur de clé étrangère n'a aucune valeur de clé primaire correspondante.
action: Supprimez la clé étrangère ou ajoutez une clé primaire correspondante.

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

edit # 1

Pour vos informations aimables, voici un site où vous pouvez obtenir de l'aide avec toutes les codes d'erreur Oracle.

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

Voici la page d'accueil de ce site: http://www.ora-code.com/ < / a>

où vous pouvez remplacer le code d'erreur dans l'URL en fonction du code d'erreur que vous obtenez, et vous accéderez à la page pour cette erreur.


3 commentaires

Vous dites donc que je devrais laisser tomber les deux tables, puis créer la table de caractères de caractères de caractères de caractères d'abord, puis insérez l'instruction dans la table des composants?


Idéalement, sachez ce qui est dépendant et ce qui n'est pas. Dans votre scénario, composant dépend de typecomponent . J'aime penser à cela comme un objet atomique. Cela peut exister seul. D'autre part, composant ne peut pas exister sans typecomponent , car son champ TYPEID Références de la clé primaire du Typecomponent table. Par conséquent, lors de l'insertion dans composant , le moteur de base de données vérifie la référence que vous lui donnez, la valeur du typecomponent.typecomponentid , et comme cela ne peut pas le trouver, rejette l'insertion, sinon vous auriez une préoccupation d'intégrité des données.


Je ne pense pas que l'ordre de création de table est un problème ici, car vous avez dit qu'ils existent tous les deux dans votre base de données. Mis à part, il aurait peut-être rendu évident si vous auriez créé le tableau typecomponent avant le composant , une ligne doit exister dans typecomponent Afin d'insérer dans composant .



1
votes

Cette erreur est présente parfois avec la clé référencée (clé étrangère dans mon cas) Cela a des erreurs. Veuillez recréer la clé référencée dans le tableau.


0 commentaires