【问题标题】:Why postgres returns unordered data in select query, after updation of row?为什么 postgres 在更新行后在选择查询中返回无序数据?
【发布时间】:2018-09-19 01:23:21
【问题描述】:

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

提前致谢。

【问题讨论】:

  • 如果没有明确的ORDER BY,则无法保证订单。期间。

标签: sql postgresql select


【解决方案1】:

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

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

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

永远不要依赖默认顺序。 It is undefined behaviour.

【讨论】:

    【解决方案2】:

    SQL 表代表 无序 集合。

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

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

    【讨论】:

    • 应该是SQL tables represent unordered bags,而不是sets
    猜你喜欢
    • 2015-10-05
    • 1970-01-01
    • 2021-05-25
    • 2023-04-05
    • 1970-01-01
    • 2019-08-09
    • 2020-01-13
    • 1970-01-01
    • 2014-11-16
    相关资源
    最近更新 更多