sql >> Databasteknik >  >> RDS >> Oracle

SQL-fel "Föräldranyckel hittades inte" för felaktigt använda främmande nycklar?

Tyvärr (för din DDL-kod) måste jag hålla med @William Robertson - du måste ändra din modell, och därför måste du omarbeta din DDL-kod helt. Skälen till detta är följande:

Om vi ​​tittar på en omvänd modell, från din ursprungliga DDL-kod, kan vi se att REQUISITION har 3 (förlåt, 4) överordnade tabeller. Det är därför dess insatser alltid misslyckas, på grund av brott mot främmande nyckel. Din modell:

Ett förenklat exempel som illustrerar problemet i form av DDL-kod kan se ut ungefär så här:

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

Så, med våra överordnade tabeller ifyllda, bara en snabb kontroll:

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 

Allt väl. Nu vill vi infoga några rader i vår underordnade tabell.

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

Du ser att den korrekta överordnade tabellen inte bara "plockas automatiskt".

I Williams modell OTOH har REQUISITION endast en förälder (tabell) med avseende på "tillbehör". Vilket borde göra det mycket lättare att infoga rader ... se nedan.



  1. Är det möjligt att UPPDATERA en JOINED-tabell med hjälp av Codeigniters Active Record?

  2. Bild från MySQL-databas skrivs inte ut

  3. 500 internt serverfel?

  4. 4 sätt att få databassamlingen i MariaDB