2012-01-02 52 views

Trả lời

22

Theo tiêu chuẩn SQL, khóa ngoại phải tham chiếu khóa chính hoặc khóa duy nhất của bảng cha. Nếu khóa chính có nhiều cột, khóa ngoại phải có cùng số và thứ tự các cột. Do đó khóa ngoài tham chiếu đến một hàng duy nhất trong bảng cha; có thể không có bản sao.


Re bình luận của bạn:

Nếu T.A là một khóa chính, sau đó không bạn không thể có bất kỳ bản sao. Bất kỳ khóa chính nào phải là duy nhất và không rỗng. Do đó nếu bảng con có khóa ngoài tham chiếu khóa chính của cha, nó phải khớp với một giá trị không rỗng, duy nhất và do đó tham chiếu chính xác một hàng trong bảng cha. Trong trường hợp này, bạn không thể tạo một hàng con tham chiếu đến nhiều hàng cha.

Bạn có thể tạo hàng con có cột khóa ngoài là NULL, trong trường hợp này nó không tham chiếu đến hàng trong bảng cha.

+0

Cảm ơn, nhưng nếu chúng ta nói về khóa ngoài cột đơn như cột 'a' là khóa dự đoán trong bảng con t tham chiếu đến cột 'A' trong bảng cha T, vì vậy bây giờ không thể trong bất kỳ tình huống nào mà cột A có thể có bất kỳ giá trị trùng lặp trong bảng T? không có nghĩa là nước ngoài sương mù chính alays tham khảo một khóa chính trong bảng khác ?? – ratsy

+1

@ ratsy: Khóa ngoại phải luôn luôn tham chiếu đến một cột hoặc cột được khai báo là PRIMARY KEY hoặc UNIQUE. (Trừ khi bạn đang sử dụng MySQL. Nhưng bạn vẫn nên chỉ nhắm mục tiêu các cột PRIMARY KEY hoặc UNIQUE ngay cả trong MySQL. Tìm kiếm http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints. html cho "hệ thống không thực thi yêu cầu rằng các cột được tham chiếu là UNIQUE".) –

+0

@Catcall: Đúng, nhưng @ratsy đã gắn thẻ câu hỏi này là 'oracle' vì vậy tôi không đưa ra hành vi không chuẩn của InnoDB. Ngay cả khi sử dụng InnoDB, tôi khuyên bạn nên chống lại việc tham chiếu các hàng cha mẹ không phải là duy nhất, bởi vì rất dễ nhầm lẫn theo cách đó. –

6

Không, điều đó là không thể.

Khi bạn xác định ràng buộc khóa ngoài trên bảng, điều đó có nghĩa là chỉ có một khóa tương ứng trên bảng nước ngoài. Nếu bội số tồn tại trên bàn nước ngoài, cái nào có nghĩa là?

Wikipedia có định nghĩa này trên Foreign key nhập:

Một khóa ngoại là một lĩnh vực trong một bảng quan hệ phù hợp với một khóa ứng viên của bảng khác

phím Candidate là duy nhất trong một bảng .

+0

Cảm ơn sự giúp đỡ .. – ratsy

7

Có, một khóa ngoại có thể tham chiếu cột có giá trị trùng lặp.

Điều này có thể xảy ra nếu khóa chính sử dụng chỉ mục không phải duy nhất và không được xác thực khi được tạo. (Nhưng tôi chưa bao giờ thấy một tình huống như thế này trong cuộc sống thực. Như @ Bill Karwin chỉ ra, nó sẽ là rất khó hiểu. Vì vậy, đây có thể không phải là một tình huống mà bạn thực sự cần phải lo lắng.)

--Create a table with two duplicate rows 
create table test1(a number); 
insert into test1 values(1); 
insert into test1 values(1); 
commit; 

--Create a non-unique index 
create index test1_index on test1(a); 

--Use the non-unique index for the primary key, do not validate 
alter table test1 add constraint test1_pk primary key (a) 
    using index test1_index novalidate; 

--Build another table with a foreign key to TABLE1 
create table test2(a number, 
    constraint test2_fk foreign key (a) references test1(a)); 

--Inserting a value that refers to the duplicate value still works. 
insert into test2 values(1); 
commit; 

--The foreign key still works: 
--ORA-02291: integrity constraint (TEST2_FK) violated - parent key not found 
insert into test2 values(2); 

--The primary key works as expected, but only for new values: 
--ORA-00001: unique constraint (TEST1_PK) violated 
insert into test1 values(1); 
+0

Wacky. theo thể loại của "tại sao bạn sẽ làm điều đó?" :-) Nhưng cảm ơn cho ví dụ rõ ràng! –

+0

Cảm ơn Jonearles cho ví dụ trên! .... tình huống tương tự trong cơ sở dữ liệu đang sử dụng, nhưng tại sao & như thế nào ..? – ratsy

+0

Có một số lý do chính đáng để sử dụng một chỉ mục không duy nhất cho khóa chính; hạn chế khó khăn, nhiều tùy chọn để xây dựng lại (đặc biệt song song), chỉ số tồn tại trước khi các ràng buộc, vv Nhìn ở đây để biết thông tin về các chỉ số duy nhất và không duy nhất: http://richardfoote.wordpress.com/2008/06/04/primary -keys-and-non-unique-indexes-whats-really-happen/ NOVALIDATE là loại kỳ quặc. Theo tôi biết, không có lợi thế để sử dụng, trừ khi bạn chỉ cần có một số dữ liệu "xấu". Những trường hợp đó thực sự cần được ghi lại. Nếu nó không được ghi lại, có lẽ đó chỉ là một sai lầm? –

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