2009-07-10 77 views
80

Làm cách nào để xác định khóa chính kết hợp bao gồm hai trường trong SQL?Làm cách nào để xác định khóa chính kết hợp trong SQL?

Tôi đang sử dụng PHP để tạo bảng và mọi thứ. Tôi muốn đặt tên bảng là voting với các trường QuestionID, MemeberIDvote. Và khóa chính Composite bao gồm các trường QuestionIDMemberID.

Tôi nên làm như thế nào?

+0

"Và QuestionID và MemberID sẽ là khóa chính." (QuestionID, MemberID) sẽ là khóa * chính *. Chỉ có một khóa và nó bao gồm hai cột. – Draemon

Trả lời

162

Chỉ để làm rõ: một bảng có thể có nhiều nhất một khóa chính. Khóa chính bao gồm một hoặc nhiều cột (từ bảng đó). Nếu khóa chính bao gồm hai hoặc nhiều cột, nó được gọi là khóa chính tổng hợp. Nó được định nghĩa như sau:

CREATE TABLE voting (
    QuestionID NUMERIC, 
    MemberID NUMERIC, 
    PRIMARY KEY (QuestionID, MemberID) 
); 

Cặp (QuestionID, MemberID) phải là duy nhất cho bảng và giá trị không được là NULL. Nếu bạn thực hiện một truy vấn như sau:

SELECT * FROM voting WHERE QuestionID = 7 

nó sẽ sử dụng chỉ mục của khóa chính. Tuy nhiên, nếu bạn làm điều này:

SELECT * FROM voting WHERE MemberID = 7 

nó sẽ không vì sử dụng chỉ mục tổng hợp yêu cầu sử dụng tất cả các phím từ "trái". Nếu chỉ mục nằm trên các trường (A, B, C) và tiêu chí của bạn là B và C thì chỉ mục đó không sử dụng cho bạn đối với truy vấn đó. Vì vậy, hãy chọn từ (QuestionID, MemberID) và (MemberID, QuestionID) tùy theo cách nào phù hợp nhất cho cách bạn sử dụng bảng.

Nếu cần thiết, thêm một chỉ mục trên kia:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID); 
+3

Câu trả lời hay. Chỉ cần làm rõ, QuestionID và MemberID không phải là các khóa chính riêng biệt mà là sự kết hợp của chúng tạo thành một cặp/tuple duy nhất. – Peter

+4

Có lợi ích gì khi thêm chỉ mục vào '(MemberID, QuestionID)', thay vì chỉ 'MemberID'? Theo như tôi đã hiểu, bạn sẽ có được tìm kiếm được lập chỉ mục khi chọn với 'QuestionId', và cũng' (QuestionId, MemeberId) ', do đó, chỉ một phần tử bị thiếu chỉ là' MemberId'. – swalog

+0

Tôi biết câu trả lời này khá cũ nhưng kể từ khi nó xuất hiện trong một tìm kiếm google ... Có vẻ như có một mâu thuẫn trong văn bản về cột nào được sử dụng (hoặc không) cho chỉ mục mặc định (es?). Hơn nữa, nó giả định rằng mỗi RDBMS sẽ tự động tạo một chỉ mục trên khóa chính, nhưng vì nó không được yêu cầu bởi bất kỳ tiêu chuẩn nào, có thể có các trường hợp góc ngoài đó. –

5
CREATE TABLE `voting` (
    `QuestionID` int(10) unsigned NOT NULL, 
    `MemberId` int(10) unsigned NOT NULL, 
    `vote` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`QuestionID`,`MemberId`) 
); 
Các vấn đề liên quan