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

时间:2009-07-10 15:44:55

标签: sql primary-key composite-primary-key

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

我正在使用PHP来创建表格和所有内容。我想创建一个包含字段votingQuestionIDMemeberID的表名vote。 Composite主键由字段QuestionIDMemberID组成。

我该怎么做?

4 个答案:

答案 0 :(得分:195)

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

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

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

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

CREATE UNIQUE INDEX idx1 ON voting (MemberID, QuestionID);

答案 1 :(得分: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`)
);

答案 2 :(得分:1)

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

语法:

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

答案 3 :(得分:-1)

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

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