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

Posted

技术标签:

【中文标题】如何在 SQL 中定义复合主键?【英文标题】:How can I define a composite primary key in SQL? 【发布时间】:2010-11-09 18:26:28 【问题描述】:

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

我正在使用 php 创建表和所有内容。我想用字段QuestionIDMemeberIDvote 创建一个表名voting。复合主键由字段QuestionIDMemberID 组成。

我应该怎么做?

【问题讨论】:

"并且 QuestionID 和 MemberID 将是主键。" (QuestionID, MemberID) 将是(复合)主。只有一个键,它由两列组成。 【参考方案1】:

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

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);

【讨论】:

好答案。澄清一下,QuestionID 和 MemberID 不是单独的主键,而是它们的组合形成一个唯一的对/元组。 (MemberID, QuestionID) 上添加索引而不是在MemberID 上添加索引有什么好处?据我了解,使用QuestionId(QuestionId, MemeberId) 进行选择时,您会得到索引查找,因此唯一缺少的是MemberId 我知道这个答案已经很老了,但是因为它是在谷歌搜索期间弹出的......关于默认索引使用(或不使用)哪些列的文本似乎存在不一致(es ?)。此外,它假设每个 RDBMS 都会自动在主键上创建索引,但由于任何标准都没有要求,因此可能存在一些极端情况。 因为这两个字段都是来自其他表的简单(并且可能是主)键,所以示例显示的是复合键而不是复合键【参考方案2】:
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`)
);

【讨论】:

【参考方案3】:

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

语法:

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

以上是关于如何在 SQL 中定义复合主键?的主要内容,如果未能解决你的问题,请参考以下文章

Bigtable 和复合主键

Laravel中定义复合主键

如何在SQL Server中获取具有复合主键的表列表?

SQL:选择另一个表中没有复合主键的条目

用于更改表添加复合主键的批量 SQL 语句

sql工作台中的复合主键与自动递增主键