Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果在非唯一属性上排序,是否完全保证PostgreSQL顺序?_Sql_Postgresql_Sql Order By - Fatal编程技术网

如果在非唯一属性上排序,是否完全保证PostgreSQL顺序?

如果在非唯一属性上排序,是否完全保证PostgreSQL顺序?,sql,postgresql,sql-order-by,Sql,Postgresql,Sql Order By,可能重复: 从阅读和我在PostgreSQL中看到的问题来看,我的印象如下,但该部分并不完全明确,因此如果有人能够验证,我将不胜感激: SELECT * FROM items; 没有保证的秩序 SELECT * FROM items ORDER BY published_date ASC; 保证两个日期不同的项目以给定顺序出现,但不保证两个日期相同的项目总是以相同顺序出现 SELECT * FROM items ORDER BY published_date ASC, id ASC; 始

可能重复:

从阅读和我在PostgreSQL中看到的问题来看,我的印象如下,但该部分并不完全明确,因此如果有人能够验证,我将不胜感激:

SELECT * FROM items;
没有保证的秩序

SELECT * FROM items ORDER BY published_date ASC;
保证两个日期不同的项目以给定顺序出现,但不保证两个日期相同的项目总是以相同顺序出现

SELECT * FROM items ORDER BY published_date ASC, id ASC;
始终以相同的顺序返回项目,因为它是完全确定的

我有这个权利吗

我不太清楚在一个属性上排序(如
published\u date
)是否能保证具有相同值的记录的顺序,如第二个示例所示。

顺序,除非您使用
order BY
子句显式指定它

如果没有数据库活动,您可能会在多次执行时以相同的顺序获取数据,因为PostgreSQL只会按照它在数据库页面中找到的顺序返回行。做一个小测试:

  • 按所需顺序插入多行
  • 查询表:您将获得排序的行
  • 更新集合中的第一条记录
  • 再次查询表
  • 观察结果

简而言之:您甚至可以按所需的顺序获取行,但这只是巧合。

您做对了。唯一可以保证的订单是您的“订购人”强加的订单。如果在该顺序中存在可能的排列,那么这些都可能是有效的输出。这是问题的一个具体案例:一致的最终顺序不是巧合,因为这是因为底层数据访问及其内部组织。但是你说得对,用户不能依赖它,因为它可能会因为与应用程序完全无关的原因而更改,例如创建索引或数据库文件重新定位。谢谢!我阅读了该手册页面(从问题中链接出来),但我觉得它对于这个特殊情况不够明确。具体来说,“只有明确选择了排序步骤,才能保证特定的输出顺序。”不清楚是否通过在非唯一列上排序来“明确选择了排序步骤”。@HenrikN,正如@wildplasser提到的,
ORDER BY
中非唯一列集合中的所有排序变化都被视为正确结果。因此,应该阅读文档:如果您希望始终以“正确”的顺序接收数据,则应在
order BY
子句中明确指定一组唯一的列。@GerardoLima:是的,这只是巧合。在PostgreSQL中,如果您运行完全相同的只读查询1000次,而没有对数据库进行任何更改,并且没有强制排序的
orderby
子句,那么您几乎每次都可以获得相同的顺序,但只要执行几次,就会产生不同的排序。一个原因是您的查询可能足够复杂,使用“遗传查询优化器”,它使用启发式来考虑计划的随机子集。或者查询可能使用顺序表扫描;它将“加入”已在进行的seqscan作为优化。