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

Ram*_*eja 28 postgresql

在此输入图像描述

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

max*_*nus 38

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

资料来源: 文件

  • 从他们的文档来看,更准确地说:添加 PRIMARY KEY 约束将自动在约束中使用的列或列组上创建唯一的 btree 索引。 (4认同)
  • 这可以回答标题中提出的问题,但不会使提问者误以为是错误的期望,从而建立了问题的主体,即索引与没有“ order by”的查询的结果行的(未定义)顺序有关。PK是什么或是否被索引是无关紧要的。 (2认同)

a_h*_*ame 12

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

NO默认的"排序"命令-即使对该列的索引(这的确是Postgres里的情况:主键是唯一索引在后台支持)

关系表中的未排序.

获得特定订单的唯一(真正:唯一)方法是使用ORDER BY

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

订单可能因各种原因而改变:

  • 其他会话正在运行相同的语句
  • 表格已更新
  • 执行计划发生了变化
  • ...


ps2*_*oat 6

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

我碰到了同样的事情,我一半希望按主键的顺序返回行(不过,我并没有像您那样按顺序插入行)。它们确实在初次插入时又恢复了,但是在Postgres中编辑记录似乎将记录移到页面的末尾,并且记录很快变得混乱(我更新了除主键之外的其他字段)。