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

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

我想创建一个表名为 voting,字段为 QuestionIDMemberIDvote。复合主键由字段 QuestionIDMemberID组成。

我该怎么做?

335799 次浏览

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

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

然后,对于表,这两个值(questions tionID,MemberID)必须是唯一的,而且两个值都不能为 NULL。如果你这样查询:

SELECT * FROM voting WHERE QuestionID = 7

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

SELECT * FROM voting WHERE MemberID = 7

不会,因为使用复合索引需要使用“ left”中的所有键。如果一个索引位于字段(A、 B、 C)上,而您的条件位于 B 和 C 上,那么该索引对于该查询没有用处。因此,请从(questions tionID,MemberID)和(MemberID,questions tionID)中选择您将如何使用该表的最合适的选项。

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

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);
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`)
);

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

CREATE TABLE Student(
StudentID Number(38, 0) not null,
DepartmentID Number(38, 0) not null,
PRIMARY KEY (StudentID, DepartmentID)
);

QuestionID将是您案例中的主键。您可以使用 MemberID作为候选关键字(索引将在此) ,因为一个成员可以回答多个问题。反过来也说不通。

句法:

CREATE TABLE SAMPLE_TABLE
(COL1 integer,
COL2 integer,
COL3 integer,
PRIMARY KEY (COL1, COL2));