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

Zee*_*ang 98 sql primary-key composite-primary-key

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

我正在使用PHP来创建表和一切.我想打一个表名voting与领域QuestionID,MemeberIDvote.Composite主键由字段QuestionIDMemberID.

我该怎么做?

cle*_*tus 204

只是为了澄清:一个表最多只能有一个主键.主键由一个或多个列组成(来自该表).如果主键由两列或更多列组成,则称为复合主键.它的定义如下:

CREATE TABLE voting (
  QuestionID NUMERIC,
  MemberID NUMERIC,
  PRIMARY KEY (QuestionID, MemberID)
);
Run Code Online (Sandbox Code Playgroud)

然后,对(QuestionID,MemberID)对于表必须是唯一的,并且这两个值都不能为NULL.如果您执行以下查询:

SELECT * FROM voting WHERE QuestionID = 7
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM voting WHERE MemberID = 7
Run Code Online (Sandbox Code Playgroud)

它不会因为使用复合索引而需要使用"left"中的所有键.如果索引在字段(A,B,C)上,并且您的条件在B和C上,则该索引对该查询没用.因此,选择(QuestionID,MemberID)和(MemberID,QuestionID)最适合您使用该表的方式.

如有必要,在另一个上添加索引:

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
Run Code Online (Sandbox Code Playgroud)

  • 在`(MemberID,QuestionID)`上添加索引是否有好处,而不仅仅是`MemberID`?据我所知,你在使用`QuestionId`和`(QuestionId,MemeberId)`进行选择时会得到索引查找,所以唯一缺少的就是`MemberId`. (5认同)
  • 好答案.只是为了澄清,QuestionID和MemberID不是单独的主键,而是它们的组合形成一个唯一的对/元组. (4认同)
  • 因为这两个字段都是其他表中的简单(可能是主)键,所以示例显示的是复合键而不是复合键 (2认同)

Jus*_*tin 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`)
);
Run Code Online (Sandbox Code Playgroud)