Oracle gọi đây là ràng buộc toàn vẹn tự tham chiếu. Các tài liệu là here cho một mô tả,
Bạn tạo một hạn chế tự tham chiếu theo cách thức tương tự như bạn bình thường một:
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 thiết lập null ở đây như là một delete cascade
có lẽ sẽ quét sạch một số lượng đáng kể của bảng của bạn.
Tôi không thể nghĩ ra cách tốt hơn để làm điều này. Việc 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ọ để bạn phải set null
và có 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 this, tốt cho các tham chiếu đơn giản. và đừng quên để có một chỉ số trên FK là tốt hoặc Tom sẽ hét lên với bạn :-).
Bạn cũng có thể sử dụng cú pháp Oracle chuẩn để tạo FK tự tham chiếu trong câu lệnh tạo bảng, trô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
);
EDIT:
Trong câu trả lời cho @ popstack của bình luận dưới đây:
Trong khi bạn có thể làm điều này trong một tuyên bố không có khả năng làm thay đổi một bảng là một trạng thái khá vô lý của vấn đề. 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 sẽ muốn 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), nếu không 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 để asktom ở trên.
Nếu bạn không thể thay đổi bảng thì bạn nên giảm thứ tự tầm quan trọng.
- Tìm hiểu cách bạn có thể.
- Thay đổi thiết kế DB của bạn thành FK nên có chỉ mục và nếu bạn không có chỉ mục thì FK có thể không phải là cách để đi. Có thể có một bảng quản lý và một bảng nhân viên?
hơi ...! Bất kỳ phương pháp/đề xuất khác cho oracle? –
Tôi chưa bao giờ thử, nhưng tôi nghĩ rằng việc đưa TABLE_NAME thay vì "parent_table_name" sẽ hoạt động !! – instanceOfObject
Đó không phải là tuyên bố hợp lệ cho Oracle –