kai1412
51 天前
那还是一定要加 order by ,并且最好是唯一且有索引的字段。
postgresql 的官方说明:
使用 LIMIT 时,最好使用一个 ORDER BY 子句,将结果行约束为唯一的顺序。否则,您将获得查询行的不可预测的子集——您可能要求第十到第二十行,但按什么顺序的第十到第二十行?除非您指定 ORDER BY ,否则您不知道什么顺序。
查询规划器在生成查询计划时会考虑 LIMIT ,因此您很可能会得到不同的计划(产生不同的行顺序),具体取决于您用于 LIMIT 和 OFFSET 的内容。因此,使用不同的 LIMIT/OFFSET 值来选择查询结果的不同子集将给出不一致的结果,除非您使用 ORDER BY 强制执行可预测的结果排序。这不是一个错误;这是 SQL 不承诺以任何特定顺序交付查询结果的固有结果,除非使用 ORDER BY 来约束顺序。
如果不存在 ORDER BY 来强制选择确定性子集,则即使重复执行相同的 LIMIT 查询也可能返回表中行的不同子集。同样,这不是一个错误;在这种情况下,结果的确定性根本无法保证。