我该如何在SQL中定义由两个字段组成的复合主键?
我想创建一个名为“voting”的表,其中包含字段“QuestionID”,“MemberID”和“vote”。复合主键由字段“QuestionID”和“MemberID”组成。请问应该如何实现呢?
仅做澄清:一张表最多只能有一个主键。主键由一个或多个列(来自该表)组成。如果主键由两个或更多列组成,则称为复合主键。其定义如下:
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);
(MemberID, QuestionID)
相比仅添加MemberID
有何好处?据我所知,当使用QuestionId
进行选择时,您会获得索引查找,并且还包括(QuestionId, MemeberId)
,因此唯一缺少的将是仅MemberId
的情况。 - swalogCREATE TABLE `voting` (
`QuestionID` int(10) unsigned NOT NULL,
`MemberId` int(10) unsigned NOT NULL,
`vote` int(10) unsigned NOT NULL,
PRIMARY KEY (`QuestionID`,`MemberId`)
);
QuestionID
将是你的主键。你可以使用MemberID
作为候选键(对其进行索引),因为一个成员可能会回答多个问题,但反过来做就没有意义了。
语法:
CREATE TABLE SAMPLE_TABLE
(COL1 integer,
COL2 integer,
COL3 integer,
PRIMARY KEY (COL1, COL2));
CREATE TABLE Student(
StudentID Number(38, 0) not null,
DepartmentID Number(38, 0) not null,
PRIMARY KEY (StudentID, DepartmentID)
);