sql >> Database >  >> RDS >> Oracle

SQL-fout 'Oudersleutel niet gevonden' voor onjuist gebruikte externe sleutels?

Helaas (voor je DDL-code) ben ik het eens met @William Robertson - je moet je model wijzigen en dus moet je je DDL-code volledig herwerken. Redenen hiervoor zijn als volgt:

Als we naar een reverse-engineered model kijken, kunnen we uit uw oorspronkelijke DDL-code zien dat REQUISITION 3 (sorry, 4) bovenliggende tabellen heeft. Dat is de reden waarom de inserts altijd mislukken, vanwege schendingen van buitenlandse sleutels. Uw model:

Een vereenvoudigd voorbeeld, dat het probleem illustreert in de vorm van DDL-code, zou er ongeveer zo uit kunnen zien:

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 ;
/

Dus, met onze bovenliggende tabellen gevuld, even een snelle controle:

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 

Alles goed. Nu willen we enkele rijen in onze onderliggende tabel invoegen.

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

Je ziet dat de juiste bovenliggende tabel niet zomaar "automatisch wordt gekozen".

In William's model OTOH heeft REQUISITION slechts één ouder (tabel) met betrekking tot "benodigdheden". Dat zou het invoegen van rijen veel gemakkelijker moeten maken ... zie hieronder.



  1. Kan ik een beperking hebben op het aantal verschillende waarden in een kolom in SQL?

  2. De Unix-tijdstempel retourneren in SQL Server (T-SQL)

  3. Manieren om gegevensversiebeheer te implementeren in PostreSQL

  4. Totale rijen tellen en groeperen op een kolom in mysql