sql >> Database teknologi >  >> RDS >> Oracle

SQL-fejl 'Forældrenøgle ikke fundet' for forkert brugte fremmednøgler?

Desværre (for din DDL-kode) må jeg være enig med @William Robertson - du skal ændre din model, og derfor skal du omarbejde din DDL-kode fuldstændigt. Årsagerne til dette er som følger:

Ser vi på en omvendt manipuleret model, fra din originale DDL-kode, kan vi se, at REQUISITION har 3 (beklager, 4) overordnede tabeller. Det er derfor, dets indsætninger altid mislykkes på grund af krænkelser af fremmednøgler. Din model:

Et forenklet eksempel, der illustrerer problemet i form af DDL-kode, kunne se sådan ud:

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 vores overordnede tabeller udfyldt, bare et hurtigt tjek:

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 

Alt godt. Nu vil vi indsætte nogle rækker i vores underordnede tabel.

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 kan se, at den korrekte overordnede tabel ikke bare "plukkes automatisk".

I Williams model OTOH har REQUISITION kun én forælder (tabel) med hensyn til "forsyninger". Hvilket burde gøre det meget nemmere at indsætte rækker ... se nedenfor.



  1. Migrerer til OpenJDK 11, hvilken version af MySql-stikket er kompatibelt med java 11?

  2. Flytning af data fra SQL Server til Oracle gentagne gange

  3. Opret en brugerdefineret forsendelsesmetode i OpenCart:Anden del

  4. mysql_insert_id med opdatering