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

9

我对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,postgress使用什么默认排序?

提前感谢。


2
没有明确的 ORDER BY,就没有保证的顺序。这是毋庸置疑的。 - Lukasz Szozda
2个回答

16
简单来说,“默认顺序”是从磁盘中读取的任意顺序。更新一行不会直接更改该行,通常将旧行标记为已删除并写入新行。
当Postgres从内存页面读取行时,它通常会按照它们在页面上存储的顺序(可能)读取它们。它将以它认为最快的顺序读取页面(这可能与它们在磁盘上的顺序相同或不同)。它可能会根据是否决定使用索引而改变。因此,它可以在您的应用程序没有请求任何不同的情况下突然更改。
如果您没有指定order by,它将不会采取任何重新排序的操作。
永远不要依赖默认顺序。它是未定义的行为

是的,缺少ORDER BY id ASC就意味着没有保证记录按id升序排序。MySQL也是同样的情况。DBMA引擎会按照它们想要的方式对记录进行排序,没有任何一致性的保证。 - Daniel Viglione

1

SQL表格代表无序集合。

SQL结果集是无序的,除非你明确地包含一个order by

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


1
应该是“SQL表代表无序的包”,而不是“集合”。 - Haleemur Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接