PostgreSQL复合主键

时间:2012-07-05 20:25:17

标签: postgresql indexing composite-primary-key

在MySQL中,当我创建复合主键时,比如列X, Y, Z,那么所有三列都会自动成为索引。 Postgres会发生同样的事吗?

3 个答案:

答案 0 :(得分:69)

如果在(x, y, z)上创建复合主键,PostgreSQL会在UNIQUE上的一个(x, y, z)多列btree索引的帮助下实现此功能。此外,所有三列都必须为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)条件的查询速度。它还有助于yz(y,z)(x,z)上的查询,但程度要小得多。

如果您需要加快对后一种组合的查询,您可能希望更改PK约束中的列顺序或创建一个或多个其他索引。

答案 1 :(得分:2)

Yes

  

当为表定义唯一约束或主键时,PostgreSQL会自动创建唯一索引。索引涵盖构成主键或唯一约束的列(如果适用,则为多列索引),并且是强制执行约束的机制。

答案 2 :(得分:1)

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