PostgreSQL排序字段不唯一导致分页查询结果出现重复数据

文章讲述了在PostgreSQL中,由于单字段排序可能导致分页查询出现重复结果的问题。解决方法是添加一个具有唯一约束或大概率唯一的字段作为次级排序条件,如主键。同时提到在n对1关系的连表查询中,确保根据一端排序时加入另一端的ID以避免重复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

pg单字段排序,排序字段中可能会出现重复,这样就会导致我们在进行分页查询时会出现一些和预期不相符的现象,如这个数据在第一页出现了,然后再第二页又出现。

复现步骤

create table test_select_order_page_duplicate
(
id varchar(36) not null
constraint test_select_order_page_duplicate_pk
primary key,
name varchar,
age integer
);

alter table test_select_order_page_duplicate owner to postgres;


insert
into test_select_order_page_duplicate
( id, name, age )
values
( '1111', 'aa', 12 ),
( '2222', 'aa', 12 ),
( '3333', 'aa', 12 ),
( '4444', 'aa', 12 ),
( '5555', 'aa', 13 ),
( '6666', 'aa', 12 ),
( '7777', 'aa', 12 ),
( '8888', 'aa', 13 ),
( '9999', 'aa', 12 ),
( '10101010', 'aa', 12 ),
( '11111111', 'aa', 14 ),
( '12121212', 'aa', 14 ),
( '13131313', 'aa', 12 );

查询第一页

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3;

idnameage
2222aa12
3333aa12
1111aa12

查询第二页

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3 offset 3;
idnameage
2222aa12
6666aa12
7777aa12

可以明显看到,两次分页查询出现了同一条id为2222的记录,但实际上数据库里只有一条2222,查询结果莫名出现了重复数据。

解决方式

核心思路就是让order by拥有唯一性。

具体解决方式就是,补充一个有唯一约束或者大概率唯一的字段作为次级排序条件。

例如,补充主键作为排序条件:

select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age, tsopd.id desc

预防

n对1关系的连表查询时,如果根据1端表的字段排序就肯定要加一个n端的id

本篇文章如有帮助到您,请给「翎野君」点个赞,感谢您的支持。

首发链接:https://www.cnblogs.com/lingyejun/p/17726636.htmll

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值