150

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

我正在使用 PHP 创建表和所有内容。我想voting用字段QuestionIDMemeberIDvote. 复合主键由字段QuestionID和组成MemberID

我该怎么做?

4

4 回答 4

276

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

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);
于 2009-07-10T15:46:18.063 回答
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`)
);
于 2009-07-10T16:01:06.660 回答
1

QuestionID将是您的情况的主键。您可以将MemberID其用作候选键(索引将在此),因为一个成员可以回答多个问题。反过来就没有意义了。

句法:

CREATE TABLE SAMPLE_TABLE  
(COL1 integer,  
COL2 integer,  
COL3 integer,  
PRIMARY KEY (COL1, COL2));  
于 2021-02-28T06:32:03.503 回答
0

在Oracle数据库中我们可以这样实现。

CREATE TABLE Student(
  StudentID Number(38, 0) not null,
  DepartmentID Number(38, 0) not null,
  PRIMARY KEY (StudentID, DepartmentID)
);
于 2020-08-31T20:41:10.630 回答