为什么postgres在更新行之后返回select查询中的无序数据?

问题描述 投票:0回答:2

我对postgres返回的行的默认排序感到有点困惑。

postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  5 | c1\
  6 | c2
  7 | c3
(7 rows)

postgres=# update check_user set name = 'c1' where name = 'c1\';
UPDATE 1
postgres=# select * from check_user;
 id | name
----+------
  1 | x
  2 | y
  3 | z
  4 | a
  6 | c2
  7 | c3
  5 | c1
(7 rows)

在任何更新之前,它返回按id排序的行,但在更新之后,订单已更改。所以我的问题是,如果没有指定order by,postgres使用什么默认排序?

提前致谢。

sql postgresql select
2个回答
3
投票

简单地说,“默认顺序”是从磁盘读取的任何内容。更新行不会更改行...通常它将旧行标记为已删除并写入新行。

当postgres从内存页面读取行时,它(可能)将按照它们存储在页面上的顺序读取它们。它会按照它认为最快的顺序读取页面(可能是也可能不是它们在磁盘上的显示方式)。它可以根据它是否决定使用索引而改变。因此,如果没有您的应用程序要求任何不同的东

如果您未指定order by,则不会采取任何措施对其进行重新排序。

永远不要依赖默认订单。 It is undefined behaviour


1
投票

SQL表表示无序集。

除非明确包含order by,否则SQL结果集是无序的。

你的select没有order by。因此,行可以以任何顺序返回。即使两次运行相同的查询也可以生成不同的订单。

© www.soinside.com 2019 - 2024. All rights reserved.