如何在SQL中定义复合主键?

问题描述:

如何定义由SQL中的两个字段组成的复合主键?如何在SQL中定义复合主键?

我使用PHP来创建表和一切。我想创建一个表格名称voting,并且字段QuestionIDMemeberIDvote。组合主键由字段QuestionIDMemberID组成。

我该怎么做?

+0

“而QuestionID和MEMBERID将是主键。” (QuestionID,MemberID)将是(复合)主*键*。只有一个键,它由两列组成。 – Draemon 2009-07-10 16:22:08

只是为了说明:表格最多只能有一个主键。主键由一个或多个列(来自该表)组成。如果主键由两列或更多列组成,则称其为复合主键。它定义如下:然后

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

对(QuestionID,MEMBERID)必须为表独特和既不值可以为NULL。如果你做这样的查询:

SELECT * FROM voting WHERE QuestionID = 7 

它将使用主键的索引。但是,如果你这样做:

SELECT * FROM voting WHERE MemberID = 7 

它不会因为使用复合索引需要使用“左”的所有键。如果索引位于字段(A,B,C)上,并且您的条件位于B和C上,那么该索引对于您的查询来说没有用处。因此,请从(QuestionID,MemberID)和(MemberID,QuestionID)中选择哪一个最适合您如何使用表格。

如果有必要,对其他添加索引:

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

很好的答案。为了澄清,QuestionID和MemberID不是单独的主键,而是它们的组合形成了唯一的对/元组。 – Peter 2009-07-10 15:47:30

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`) 
);