主键是否在postgresql中自动编制索引?

主键是否在postgresql中自动编制索引?,postgresql,indexing,primary-key,Postgresql,Indexing,Primary Key,我已经用ID列作为主键创建了表名d,然后像输出中所示插入了记录,但在获取所有记录之后,这个输出仍然显示为插入记录的顺序。但输出为see now now now now now now now now now now ordered form。PostgreSQL会自动为每个唯一约束和主键约束创建一个索引,以强制执行唯一性。因此,没有必要为主键列显式创建索引。(有关详细信息,请参见创建索引。) 资料来源: 但在获取所有记录后,此输出仍然显示为与插入记录的顺序相同 有无默认的“排序”顺序-即使该列


我已经用ID列作为主键创建了表名d,然后像输出中所示插入了记录,但在获取所有记录之后,这个输出仍然显示为插入记录的顺序。但输出为see now now now now now now now now now now ordered form。

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

资料来源:

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

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

关系表中的行未排序。 获取特定订单的唯一方法是使用order BY

如果您没有指定一个orderby,数据库可以按照它想要的任何顺序自由返回行,并且该顺序可以随时更改

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

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

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


我遇到了与您相同的情况,我有一半希望按主键的顺序返回行(不过,我并没有像您那样按顺序插入它们)。在初始插入时,它们确实会返回,但在Postgres中编辑记录似乎会将记录移动到页面的末尾,记录很快就会变得无序(我更新了主键以外的字段)。

您的表太小了,Postgres将按顺序加载整个表,而不必使用索引。它可能全部放在一页上。这就是为什么您看到的数据是按加载顺序排列的。表不是按顺序排列的。您希望在没有order by的情况下获得任何order是不合理的。这可能会重复回答标题中提出的问题,但不会消除提问者的错误期望,从而确定问题的主体,即索引与没有
order by
的查询的结果行(未定义)顺序相关。PK是什么或者是否被索引是不相关的。从他们的文档中,更准确地说:添加主键约束将自动在约束中使用的列或列组上创建唯一的btree索引。