Làm cách nào để xác định khóa chính tổng hợp trong SQL?


112

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

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

Tôi nên làm điều này như thế nào?


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

Câu trả lời:


229

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 một khóa chính bao gồm hai hoặc nhiều cột thì 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)
);

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

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

Nếu cần, hãy thêm một chỉ mục vào cái khác:

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

5
Câu trả lời tốt. 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 / bộ mã duy nhất.
Peter

5
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ẽ nhận được tra cứu được lập chỉ mục khi chọn với QuestionIdvà cũng có thể (QuestionId, MemeberId), vì vậy chỉ có một cái bị thiếu MemberIdduy nhất.
swalog

Tôi biết câu trả lời này khá cũ nhưng vì nó xuất hiện trong quá trình tìm kiếm trên google ... Có vẻ như có sự mâu thuẫn trong văn bản về những cột nào được sử dụng (hoặc không) cho (các) chỉ mục mặc định. 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, nên có thể có các trường hợp góc xảy ra.
Tới 마 SE

Vì cả hai trường đều là khóa đơn giản (và có thể là chính) từ các bảng khác, ví dụ hiển thị khóa ghép không phải khóa tổng hợp
guymid

6
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`)
);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.