Postgres分页的唯一排序顺序

Ash*_*ral 5 sql postgresql

在尝试从Postgres中的服务器端实现分页时,我遇到了一个问题,即在使用limit和offset关键字时,您必须在唯一列(可能是主键)上提供ORDER BY子句。

在我的情况下,我将PU密钥使用UUID生成,因此我不能依赖于增加密钥的顺序。ORDER BY pkey DESC-可能不会总是导致新行排在最前面。所以我求助于使用Created Date列-timestamp列,该列应该是唯一的。

但是我的问题是,如果UI客户端要按其他列排序怎么办?如果它可能并不总是唯一的列,我求助于ORDER BY user_column created_dt DESC,以保持可预测的postgres分页结果。

这是正确的方法吗?我不确定我走的路是否正确。请指教。

Phi*_*ler 5

我在一个旧的博客文章中谈到了这个确切的问题(在使用ORM的背景下):

关于结合使用排序和分页的最后一点。如果ORDER BY子句不包含表示数据中的经验序列的字段,则实现分页的查询的结果可能会很奇怪。在大多数(也许是所有)数据库引擎中,不能保证排序顺序超出在ORDER BY子句中明确指定的范围。例如:如果您有100个订单都在完全相同的日期发生,并且要求该数据按该日期排序的第一页,然后要求以相同的方式对数据的第二页进行排序,则完全有可能您将获得在两个页面上重复的一些数据。因此,根据查询和“可排序”数据的分布,

http://psandler.wordpress.com/2009/11/20/dynamic-search-objects-part-5sorting/

  • 如果按创建数据的经验序列(PK或created_dt)的方式进行排序,则始终可获得可预测的结果。如果您按其他一些非唯一的列进行排序,那么您还必须*另外*根据另外的一列(或另外的列)进行排序,这将共同创建一个经验序列。根本没有办法解决这个问题。 (2认同)