2012-07-05 363 views
22

在MySQL中,当我创建一个复合主键时,比方说列X, Y, Z,那么所有三列自动成为索引。 Postgres也一样吗?PostgreSQL复合主键

+2

你的意思是MySQL创建**三** *索引*?听起来非常奇怪 – 2012-07-05 21:19:32

回答

52

如果您创建复合主键(x, y, z),PostgreSQL在(x, y, z)的一个UNIQUE多列索引的帮助下实现此功能。此外,所有三列必须是NOT NULL,当然这是PRIMARY KEYUNIQUE INDEX之间的主要区别。

除了对你的数据有明显的限制,该multi-column index也有查询超过三个个人指标上xyz表现有点不同的效果。

我们对最近的这个问题进行了非常彻底的讨论on dba.SE in this related question。通过示例,基准,讨论和展望index-only scans in version 9.2即将发布的功能。

特别地,上(x, y, z)主键将加快与条件的查询上x(x,y)(x,y,z)最佳。它也将有助于查询y,z,(y,z)(x,z),但程度较低。

如果您需要加快对后者组合的查询,可能需要创建一个或多个附加索引。

2
Yes

PostgreSQL自动当唯一约束或主键为表中定义的唯一索引。该索引涵盖组成主键或唯一约束的列(如果适用,则为多列索引),并且是实施约束的机制。

+1

我认为问题是每列是否有自己的索引。 – 2012-07-05 20:54:07

+0

同意。问题不是自动创建1个多列索引,而是创建3个单列索引。答案是否定的。您的答案仍然相关,因为它在编辑课程之后提供补充信息。实际上,@ dondi-michael-stroma的答案比原始请求者选择的答案更有意义。 – Chucky 2014-09-23 06:27:43

1

不,你会得到一个三列主键索引。