2012-01-07 31 views

Trả lời

-2
CREATE TABLE TABLE_NAME (
    `empid_number` int  ( 11) NOT NULL auto_increment, 
    `employee`  varchar (100) NOT NULL    , 
    `manager_number` int  ( 11) NOT NULL    , 
    PRIMARY KEY (`empid_number`), 
    CONSTRAINT `manager_references_employee` 
    FOREIGN KEY (`manager_number`) REFERENCES (`empid_number`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Hy vọng điều đó sẽ hữu ích!

+0

hơi ...! Bất kỳ phương pháp/đề xuất khác cho oracle? –

+0

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

+3

Đó không phải là tuyên bố hợp lệ cho Oracle –

20

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.

  1. Tìm hiểu cách bạn có thể.
  2. 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?
+0

có thể là giải pháp, NHƯNG trong trường hợp của tôi, không có 'trình kích hoạt', không cho phép 'thay thế'. đơn giản 'tạo bảng' theo sau là 'chèn' chỉ cần thiết. Hiện nay? –

+0

@popstack, tôi có quá nhiều điều để nói nên tôi đã thêm một bản chỉnh sửa cho câu trả lời. – Ben

+0

Chắc chắn bạn sẽ phải xác định ràng buộc khóa duy nhất hoặc ngoại lệ cho ràng buộc khóa ngoài để tham chiếu. Và bạn luôn có thể bỏ qua mệnh đề 'ON DELETE', có chức năng như một mệnh đề' ON DELETE RESTRICT' trong các RDBMS khác, ngăn chặn việc xóa một phụ huynh có các bản ghi con. –

1

SELF TÀI LIỆU THAM KHẢO QUERY ...

Alter table table_name ADD constraints constraints_name foreign key(column_name1,column_name2..) references table_name(column_name1,column_name2...) ON DELETE CASCADE; 

EX ALTER TABLE Employee ADD CONSTRAINTS Fr_key(mgr_no) references employee(Emp_no) ON DELETE CASCADE;

Các vấn đề liên quan