Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lỗi SQL 'Không tìm thấy khóa chính' cho các khóa nước ngoài được sử dụng không đúng cách?

Thật không may (đối với mã DDL của bạn), tôi phải đồng ý với @William Robertson - bạn cần phải thay đổi mô hình của mình và do đó, bạn cần phải làm lại hoàn toàn mã DDL của mình. Lý do cho điều này như sau:

Nhìn vào một mô hình được thiết kế ngược, từ mã DDL ban đầu của bạn, chúng ta có thể thấy rằng REQUISITION có 3 (xin lỗi, 4) bảng cha. Đó là lý do tại sao các lần chèn của nó luôn bị lỗi, do vi phạm khóa nước ngoài. Mô hình của bạn:

Một ví dụ đơn giản, minh họa vấn đề dưới dạng mã DDL, có thể trông giống như sau:

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

Vì vậy, với các bảng chính của chúng ta đã được điền, chỉ cần kiểm tra nhanh:

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 

Tất cả đều tốt. Bây giờ chúng ta muốn chèn một số hàng vào bảng con của chúng ta.

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

Bạn thấy rằng bảng mẹ chính xác không chỉ "được chọn tự động".

Trong mô hình OTOH của William, REQUISITION chỉ có một phụ huynh (bảng) liên quan đến "nguồn cung cấp". Điều này sẽ giúp việc chèn các hàng dễ dàng hơn nhiều ... xem bên dưới.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách hiển thị giá trị số bằng chữ

  2. Oracle SQL Ghép nối các số tuần tự trái phải với số nhận dạng

  3. Nhận tổng số hàng trong ORACLE và sau đó chỉ nhận được 4 kết quả

  4. Chế độ xem vật chất hóa và bảng có cùng tên

  5. java.sql.SQLException:ORA-01652:không thể mở rộng phân đoạn tạm thời thêm 128 trong không gian bảng TEMP (Ngay cả sau khi mở rộng)