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

Thực thi ràng buộc khóa ngoại cho các cột của cùng một bảng

Oracle gọi đây là một ràng buộc toàn vẹn tự tham chiếu. Tài liệu ở đây để mô tả,

Bạn tạo ràng buộc tự tham chiếu theo cách giống như cách bạn làm thông thường:

alter table employees
  add constraint employees_emp_man_fk
      foreign key ( manager_no )
      references employees ( emp_id )
   on delete set null
      ;

Tôi giả định rằng manager_no của bạn là nullable. Tôi đã thêm set null ở đây dưới dạng delete cascade có thể sẽ xóa sạch một lượng đáng kể bảng của bạn.

Tôi không thể nghĩ ra một cách tốt hơn để làm điều này. Xóa người quản lý sẽ không dẫn đến việc xóa tất cả nhân viên của họ, vì vậy bạn phải set null và có một trình kích hoạt trên bàn để cảnh báo bạn với bất kỳ ai không có người quản lý.

Tôi luôn thích trang web này, rất tốt để tham khảo đơn giản. và đừng quên có chỉ số trên FK nếu không Tom sẽ hét vào mặt bạn :-).

Người ta cũng có thể sử dụng cú pháp Oracle tiêu chuẩn để tạo FK tự tham chiếu trong câu lệnh tạo bảng, giống như sau.

create table employees
 ( emp_id number
 , other_columns ...
 , manager_no number
 , constraint employees_pk 
    primary key (emp_id)
 , constraint employees_man_emp_fk
    foreign key ( manager_no )
    references employees ( emp_id )
    on delete set null
 );

CHỈNH SỬA:

Để trả lời cho nhận xét của @ popstack bên dưới:

Trong khi bạn có thể làm điều này trong một câu lệnh, không thể thay đổi bảng là một trạng thái khá nực cười. Bạn chắc chắn nên phân tích một bảng mà bạn sẽ chọn từ đó và bạn vẫn muốn có một chỉ mục trên khóa ngoại (và có thể nhiều cột hơn và / hoặc nhiều chỉ mục hơn) nếu không thì bất cứ khi nào bạn sử dụng khóa ngoại, bạn sẽ làm quét toàn bộ bảng. Xem liên kết của tôi đến asktom ở trên.

Nếu bạn không thể thay đổi bảng thì bạn nên làm theo thứ tự mức độ quan trọng giảm dần.

  1. Tìm hiểu cách bạn có thể.
  2. Thay đổi thiết kế DB của bạn vì FK phải có chỉ mục và nếu bạn không thể có thì FK có lẽ không phải là cách để thực hiện. Có thể có một bảng quản lý và một bảng nhân viên?


  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ó truy vấn SQL nào của Oracle gộp nhiều hàng thành một hàng không?

  2. Tôi có thể sao chép:Bản ghi giả CŨ và:MỚI vào / vào một thủ tục được lưu trữ Oracle không?

  3. GROUP BY với MAX (DATE)

  4. oracle - chuyển đổi nhiều định dạng ngày tháng sang một ngày được định dạng duy nhất

  5. Làm cách nào để thay thế các giá trị cụ thể trong cột cơ sở dữ liệu oracle?