如何在 SQL 中定义由两个字段组成的复合主键?
我想创建一个表名为 voting,字段为 QuestionID、 MemberID和 vote。复合主键由字段 QuestionID和 MemberID组成。
voting
QuestionID
MemberID
vote
我该怎么做?
澄清一下: 一个表最多只能有一个主键。主键由一个或多个列(来自该表)组成。如果主键由两列或更多列组成,则称为 复合主键。其定义如下:
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));