我对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使用什么默认排序?
提前致谢。
简单地说,“默认顺序”是从磁盘读取的任何内容。更新行不会更改行...通常它将旧行标记为已删除并写入新行。
当postgres从内存页面读取行时,它(可能)将按照它们存储在页面上的顺序读取它们。它会按照它认为最快的顺序读取页面(可能是也可能不是它们在磁盘上的显示方式)。它可以根据它是否决定使用索引而改变。因此,如果没有您的应用程序要求任何不同的东
如果您未指定order by
,则不会采取任何措施对其进行重新排序。
永远不要依赖默认订单。 It is undefined behaviour。
SQL表表示无序集。
除非明确包含order by
,否则SQL结果集是无序的。
你的select
没有order by
。因此,行可以以任何顺序返回。即使两次运行相同的查询也可以生成不同的订单。