是postgresql中自动索引的主键吗?

时间:2017-03-20 08:37:07

标签: postgresql

enter image description here

我创建的表名为d,ID列为主键,然后只插入记录,如输出中所示,但在获取所有记录后,此输出仍显示与插入记录的顺序相同。但输出现在看来不是有序的形式。

3 个答案:

答案 0 :(得分:23)

PostgreSQL自动为每个唯一约束和主键约束创建索引以强制实现唯一性。因此,没有必要为主键列显式创建索引。 (有关详细信息,请参阅CREATE INDEX。)

来源: Docs

答案 1 :(得分:11)

  

但在获取所有记录后,此输出仍显示与插入记录的顺序相同

NO 默认“排序”顺序 - 即使该列上有索引(Postgres确实如此:主键支持背景中的唯一索引)

关系表中的行未排序

only (实际上:唯一)获取特定订单的方式是使用ORDER BY

如果您未指定ORDER BY,则数据库可以按任何顺序自由返回行 - 并且该订单可以随时更改。

由于种种原因,订单可能会发生变化:

  • 其他会话正在运行相同的声明
  • 表格已更新
  • 执行计划更改
  • ...

答案 2 :(得分:3)

除了其他人所说的,Postgres还没有像Microsoft SQL Server和其他数据库那样的“聚集索引”的概念。您可以对索引进行聚类,但它是一次性操作(直到您再次调用它),并且在编辑时不会维护行的聚类等。See the docs

我遇到了同样的事情,我想要按主键的顺序返回行(我没有像你那样按顺序插入它们)。他们确实在初始插入时返回,但是在Postgres中编辑记录似乎将记录移动到页面末尾,并且记录很快变得无序(我更新了除主键之外的字段)。