更新行后,为什么 postgres 在选择查询中返回无序数据?

Man*_*hit 3 sql postgresql select

我对 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)
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

Phi*_*ing 7

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

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

如果您未指定order by,则不会采取任何操作来重新排序它们。

永远不要依赖默认顺序。 这是未定义的行为


Gor*_*off 1

SQL 表表示无序集。

SQL 结果集是无序的,除非您显式包含order by.

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