我创建的表名为d,ID列为主键,然后只插入记录,如输出中所示,但在获取所有记录后,此输出仍显示与插入记录的顺序相同。但输出现在看来不是有序的形式。
答案 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中编辑记录似乎将记录移动到页面末尾,并且记录很快变得无序(我更新了除主键之外的字段)。