在PostgreSQL doc中说:
查询优化器在生成查询计划时会考虑LIMIT,因此您很可能会获得不同的计划(产生不同的行顺序),具体取决于您为LIMIT和OFFSET提供的内容。因此,使用不同的LIMIT / OFFSET值来选择查询结果的不同子集将产生不一致的结果,除非您使用ORDER BY强制执行可预测的结果排序。这不是一个bug;这是SQL不承诺以任何特定顺序传递查询结果这一事实的固有后果,除非使用ORDER BY约束订单。
但是在MySQL InnoDB表中,它们的结果将在PRIMARY KEY中传递。
为什么查询会产生不一致的结果?查询中会发生什么?
答案 0 :(得分:3)
Postgres文档和您的观察结果告诉您的是,SQL表中的记录没有内部订单。而是在无序的记录集之后建模数据库表。因此,在以下可以在MySQL或Postgres上运行的查询中:
SELECT *
FROM yourTable
LIMIT 5
数据库可以自由返回它想要的5条记录。在MySQL的情况下,如果你看到基于主键的排序,那只是巧合,并且MySQL不会提供任何这样的合同,而这总是会发生。
要解决此问题,使用ORDER BY
时应始终使用LIMIT
子句。因此,以下查询定义明确:
SELECT *
FROM yourTable
ORDER BY some_column
LIMIT 5