Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kesalahan SQL 'Kunci Induk Tidak Ditemukan' untuk Kunci Asing yang Digunakan dengan Tidak Benar?

Sayangnya (untuk kode DDL Anda) saya harus setuju dengan @William Robertson - Anda perlu mengubah model Anda, dan dengan demikian, Anda perlu mengerjakan ulang kode DDL Anda sepenuhnya. Alasan untuk ini adalah sebagai berikut:

Melihat model rekayasa balik, dari kode DDL asli Anda, kita dapat melihat bahwa REQUISITION memiliki 3 (maaf, 4) tabel induk. Itu sebabnya sisipannya selalu gagal, karena pelanggaran kunci asing. Model Anda:

Contoh sederhana, menggambarkan masalah dalam bentuk kode DDL, dapat terlihat seperti ini:

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

Jadi, dengan tabel induk kami terisi, cukup periksa:

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 

Semuanya bagus. Sekarang kita ingin menyisipkan beberapa baris ke tabel anak kita.

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

Anda melihat bahwa tabel induk yang benar tidak hanya "diambil secara otomatis".

Dalam model OTOH William, REQUISITION hanya memiliki satu induk (tabel) sehubungan dengan "persediaan". Yang seharusnya membuat penyisipan baris lebih mudah ... lihat di bawah.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ResultSet.next sangat lambat hanya ketika kueri berisi pembatasan FIRST_ROWS atau ROWNUM

  2. Daftar kunci asing dan tabel yang dirujuk di Oracle DB

  3. Bagaimana Mengonversi Angka ke String di Oracle?

  4. Fungsi DATEDIFF di Oracle

  5. Bukan bulan yang valid saat menjalankan prosedur parameter IN dengan nilai tanggal