2013-09-08 57 views
30

Tôi chỉ nghĩ rằng câu trả lời là sai vì khóa ngoài không có thuộc tính uniqueness.khóa ngoài có thể tham chiếu đến khóa chính trong cùng một bảng không?

Nhưng một số người nói rằng nó có thể là trong trường hợp tự tham gia bàn. Tôi mới đến SQL. Nếu sự thật của nó, hãy giải thích làm thế nào và tại sao?

Employee table 
| e_id | e_name | e_sala | d_id | 
|---- |------- |----- |--------| 
| 1 | Tom | 50K | A | 
| 2 | Billy | 15K | A | 
| 3 | Bucky | 15K | B | 


department table 
| d_id | d_name | 
|---- |------- | 
| A | XXX | 
| B | YYY | 

Bây giờ, d_id là khóa ngoại để làm thế nào nó có thể là khóa chính. Và giải thích điều gì đó về join. Sử dụng của nó là gì?

+0

@ sarwar026, câu hỏi đó không chính xác những gì OP đã yêu cầu ở đây ... – ryvantage

+0

Bạn có thể muốn thêm DBMS nào bạn đang sử dụng để bạn nhận được các ví dụ phù hợp với DBMS của mình. –

+0

Tôi đang sử dụng ORACLE 9.0 – AmanS

Trả lời

38

Tôi nghĩ câu hỏi hơi khó hiểu.

Nếu bạn có nghĩa là "khóa ngoại có thể" tham chiếu đến khóa chính trong cùng một bảng không? ", Câu trả lời là công ty có khi một số trả lời. Ví dụ, trong một bảng nhân viên, một hàng cho một nhân viên có thể có một cột để lưu trữ số nhân viên của người quản lý nơi người quản lý cũng là một nhân viên và do đó sẽ có một hàng trong bảng giống như một hàng của bất kỳ nhân viên nào khác.

Nếu bạn có nghĩa là "cột có thể (hoặc tập hợp cột) là khóa chính cũng như khóa ngoại trong cùng một bảng?", Câu trả lời, theo quan điểm của tôi, là không; nó có vẻ vô nghĩa. Tuy nhiên định nghĩa sau đây thành công trong SQL Server!

create table t1(c1 int not null primary key foreign key references t1(c1)) 

Nhưng tôi cho rằng điều đó là vô nghĩa nếu không có ai đó đưa ra ví dụ thực tế.

AmanS, trong ví dụ của bạn d_id trong mọi trường hợp có thể là khóa chính trong bảng Nhân viên. Một bảng chỉ có thể có một khóa chính. Tôi hy vọng điều này sẽ xóa bỏ sự nghi ngờ của bạn. d_id là/có thể là khóa chính chỉ trong bảng bộ phận.

+0

rõ ràng với tôi rằng d_id là khóa chính của bảng bộ phận. cũng d_id trong bảng nhân viên là khóa ngoại. và bạn cũng đề cập rằng d_id có thể là khóa chính trong cùng một bảng (nhân viên). giáo viên của tôi nói với tôi rằng trong trường hợp tự tham gia bảng nhân viên, điều đó có thể xảy ra. điểm này không rõ ràng với tôi như thế nào? – AmanS

+1

@AmanS, bạn nói "bạn đề cập rằng d_id có thể là khóa chính trong cùng một bảng (nhân viên)". Nhưng tôi đã không làm; đây là tuyên bố của tôi "AmanS, trong ví dụ của bạn d_id trong hoàn cảnh không có thể là một khóa chính trong bảng nhân viên". Hy vọng bạn nhận được nó. Nó không phải là có thể ngay cả trong trường hợp tự tham gia. Một cột khác trong một bảng có thể tham chiếu đến khóa chính của cùng một bảng. Ví dụ. tạo bảng nhân viên (e_id int khóa chính, e_name varchar (30), e_mgr int, khóa ngoại (e_mgr) tham chiếu nhân viên (e_id)). Đây là một trường hợp tự kết nối và e_mgr là một khoá ngoại chỉ đến khóa chính e_id. – mvsagar

+0

bạn có thể cho tôi biết bất kỳ ví dụ thực tế nào có truy vấn trong đó người nước ngoài có thể tham chiếu đến khóa chính không? nhưng đây cũng là người dưới đây (ryvantage) nói rằng nó có thể .... tôi đang bối rối xin vui lòng giúp – AmanS

15

Chắc chắn, tại sao không? Giả sử bạn có bảng Person, với id, name, ageparent_id, trong đó parent_id là khóa ngoài cùng một bảng. Bạn sẽ không cần phải bình thường hóa bảng Person thành các bảng ParentChild, điều đó sẽ quá mức cần thiết.

Person 
| id | name | age | parent_id | 
|----|-------|-----|-----------| 
| 1 | Tom | 50 |  null | 
| 2 | Billy | 15 |   1 | 

Điều gì đó tương tự.

Tôi giả sử để duy trì tính nhất quán, mặc dù vậy, sẽ cần có ít nhất 1 giá trị null cho parent_id. Hàng "nam alpha".

EDIT: Khi nhận xét hiển thị, Sam đã tìm thấy lý do chính đáng để không thực hiện việc này. Dường như trong MySQL khi bạn cố gắng thực hiện chỉnh sửa cho khóa chính, ngay cả khi bạn chỉ định CASCADE ON UPDATE, nó sẽ không phổ biến chỉnh sửa đúng cách. Mặc dù các khóa chính (thường là) không có giới hạn để chỉnh sửa trong sản xuất, tuy nhiên đó là một giới hạn không bị bỏ qua. Vì vậy, tôi thay đổi câu trả lời của tôi thành: bạn có lẽ nên tránh thực hành này trừ khi bạn có quyền kiểm soát chặt chẽ đối với hệ thống sản xuất (và có thể đảm bảo không ai thực hiện kiểm soát chỉnh sửa PK). Tôi chưa thử nghiệm nó bên ngoài MySQL.

+0

chỉ cần xem câu hỏi đã chỉnh sửa của mình bằng ví dụ. câu trả lời của bạn vẫn là có? – AmanS

+0

Nó không hoạt động đối với 'cập nhật'. kiểm tra http://sqlfiddle.com/#!9/445052/1/0 và sau đó thử thêm 'Cập nhật menu set id = 6 WHERE id = 1;' bạn sẽ nhận được '# 1451 - Không thể xóa hoặc cập nhật hàng gốc ' – Sam

+0

@Sam hai điều: 1) Tôi thấy rằng nó không hoạt động, nhưng tôi không đồng ý rằng nó sẽ thất bại. Với bản cập nhật xếp tầng, dường như không có lý do hợp lý nào khiến bản cập nhật không thành công. 2) Ai thay đổi PK trong các tình huống thực tế? Những người đang yêu cầu sự cố lol – ryvantage

3

Ví dụ: n cấp danh mục phụ cho danh mục.Dưới bảng chính-key id được giới thiệu bởi foreign-key sub_category_id

enter image description here

0

Một ví dụ điển hình của việc sử dụng id của các hàng khác trong cùng một bảng như phím nước ngoài được lồng danh sách. Xóa một hàng có con (tức là, hàng, chich tham chiếu đến id của cha mẹ), cũng có cả childred (tức là, tham chiếu id của trẻ em) ... sẽ xóa một chuỗi các hàng. Giảm bớt toàn bộ nỗi đau (và rất nhiều mã phải làm gì với trẻ mồ côi - nghĩa là các hàng liên quan đến các id không tồn tại).

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