前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PostgreSQL排序字段不唯一导致分页查询结果出现重复数据

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

作者头像
翎野君
发布2023-09-25 08:23:30
5370
发布2023-09-25 08:23:30
举报
文章被收录于专栏:翎野君

背景

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

复现步骤

代码语言:javascript
复制
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 );

查询第一页

代码语言:javascript
复制
select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3;

id

name

age

2222

aa

12

3333

aa

12

1111

aa

12

查询第二页

代码语言:javascript
复制
select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age
limit 3 offset 3;

id

name

age

2222

aa

12

6666

aa

12

7777

aa

12

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

解决方式

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

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

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

代码语言:javascript
复制
select *
from
test_select_order_page_duplicate tsopd
order by
tsopd.age, tsopd.id desc

预防

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 复现步骤
  • 解决方式
  • 预防
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档