【问题标题】:Why PostgreSQL query give inconsistent results unless enforce a predictable result ordering with ORDER BY为什么 PostgreSQL 查询会给出不一致的结果,除非使用 ORDER BY 强制执行可预测的结果排序
【发布时间】:2017-06-14 05:12:54
【问题描述】:

PostgreSQL doc 中说:

查询优化器在生成查询计划时会考虑 LIMIT,因此您很可能会根据您为 LIMIT 和 OFFSET 提供的内容获得不同的计划(产生不同的行顺序)。因此,使用不同的 LIMIT/OFFSET 值来选择查询结果的不同子集将产生不一致的结果,除非您使用 ORDER BY 强制执行可预测的结果排序。这不是错误;这是 SQL 不承诺以任何特定顺序传递查询结果这一事实的固有结果,除非使用 ORDER BY 来约束顺序。

但在 MySQL InnoDB 表中,它们的结果将在 PRIMARY KEY 中传递。

为什么查询给出不一致的结果?查询中发生了什么?

【问题讨论】:

  • MySQL 也不保证结果顺序

标签: mysql postgresql


【解决方案1】:

Postgres 文档和您的观察告诉您的是,SQL 表中的记录没有内部顺序。相反,数据库表是在无序记录集之后建模的。因此,在以下可以在 MySQL 或 Postgres 上运行的查询中:

SELECT *
FROM yourTable
LIMIT 5

数据库可以随意返回它想要的 5 条记录。在 MySQL 的情况下,如果您看到基于主键的排序,那只是巧合,并且 MySQL 不提供任何这种总是会发生的合同。

要解决这个问题,在使用LIMIT 时,您应该始终使用ORDER BY 子句。所以下面的查询是明确定义的:

SELECT *
FROM yourTable
ORDER BY some_column
LIMIT 5

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多