Oracle
 sql >> Base de données >  >> RDS >> Oracle

Erreur SQL "Clé parent introuvable" pour les clés étrangères mal utilisées ?

Malheureusement (pour votre code DDL), je dois être d'accord avec @William Robertson - vous devez changer votre modèle, et donc, vous devez retravailler complètement votre code DDL. Les raisons en sont les suivantes :

En regardant un modèle rétro-conçu, à partir de votre code DDL d'origine, nous pouvons voir que REQUISITION a 3 (désolé, 4) tables parents. C'est pourquoi ses insertions échouent toujours, en raison de violations de clé étrangère. Votre modèle :

Un exemple simplifié, illustrant le problème sous forme de code DDL, pourrait ressembler à ceci :

create table parent1 ( id number primary key ) ; -- analogy: supplies_pharmaceutical
create table parent2 ( id number primary key ) ; -- analogy: supplies_nonsurgical
create table parent3 ( id number primary key ) ; -- analogy: supplies_surgical

create table child ( -- analogy: requisitions
  id number primary key
, parentid number 
);

alter table child add constraint fkey_parent1
foreign key ( parentid ) references parent1 ( id ) ;

alter table child add constraint fkey_parent2
foreign key ( parentid ) references parent2 ( id ) ;

alter table child add constraint fkey_parent3
foreign key ( parentid ) references parent3 ( id ) ;

begin
  insert into parent1 ( id ) values ( 1 ) ;
  insert into parent2 ( id ) values ( 2 ) ;
  insert into parent3 ( id ) values ( 3 ) ;
end ;
/

Donc, avec nos tables parents remplies, juste une vérification rapide :

select 'parent1 (id) -> ' || id from parent1
union all
select 'parent2 (id) -> ' ||  id from parent2
union all
select 'parent3 (id) -> ' ||  id from parent3
;

-- result
'PARENT1(ID)->'||ID  
parent1 (id) -> 1    
parent2 (id) -> 2    
parent3 (id) -> 3 

Tout bon. Nous voulons maintenant insérer des lignes dans notre table enfant.

insert into child ( id, parentid ) values ( 100, 1 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found

insert into child ( id, parentid ) values ( 101, 2 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT3) violated - parent key not found

insert into child ( id, parentid ) values ( 102, 3 ) ;
-- ORA-02291: integrity constraint (...FKEY_PARENT2) violated - parent key not found

Vous voyez que la bonne table parent n'est pas simplement "sélectionnée automatiquement".

Dans le modèle OTOH de William, REQUISITION n'a qu'un seul parent (table) par rapport aux "fournitures". Ce qui devrait rendre l'insertion de lignes beaucoup plus facile... voir ci-dessous.