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

本文涉及的产品
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 50GB
简介: PostgreSQL排序字段不唯一导致分页查询结果出现重复数据

背景

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;
id name age
2222 aa 12
3333 aa 12
1111 aa 12

查询第二页

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拥有唯一性。

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

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

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

预防

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

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


相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
9天前
|
关系型数据库 MySQL 分布式数据库
PolarDB操作报错合集之在进行批量导出数据时,如何过滤掉视图并只导出表
在使用阿里云的PolarDB(包括PolarDB-X)时,用户可能会遇到各种操作报错。下面汇总了一些常见的报错情况及其可能的原因和解决办法:1.安装PolarDB-X报错、2.PolarDB安装后无法连接、3.PolarDB-X 使用rpm安装启动卡顿、4.PolarDB执行UPDATE/INSERT报错、5.DDL操作提示“Lock conflict”、6.数据集成时联通PolarDB报错、7.编译DN报错(RockyLinux)、8.CheckStorage报错(源数据库实例被删除)、9.嵌套事务错误(TDDL-4604)。
|
20天前
|
消息中间件 Java 关系型数据库
实时计算 Flink版操作报错合集之从 PostgreSQL 读取数据并写入 Kafka 时,遇到 "initial slot snapshot too large" 的错误,该怎么办
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
780 0
|
27天前
|
DataWorks 安全 关系型数据库
DataWorks产品使用合集之使用Flink CDC读取PostgreSQL数据时如何指定编码格式
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
4天前
|
关系型数据库 MySQL 数据库
关系型数据库mysql数据增量恢复
【7月更文挑战第3天】
13 2
|
4天前
|
关系型数据库 MySQL Shell
关系型数据库mysql数据完全恢复
【7月更文挑战第3天】
12 2
|
5天前
|
存储 关系型数据库 MySQL
|
10天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之从MySQL迁移数据到PolarDB-X时,自定义函数不会自动迁移,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
|
10天前
|
关系型数据库 MySQL 分布式数据库
PolarDB产品使用问题之要验证MySQL迁移后的数据库数据与迁移前的数据一致性,该怎么办
PolarDB产品使用合集涵盖了从创建与管理、数据管理、性能优化与诊断、安全与合规到生态与集成、运维与支持等全方位的功能和服务,旨在帮助企业轻松构建高可用、高性能且易于管理的数据库环境,满足不同业务场景的需求。用户可以通过阿里云控制台、API、SDK等方式便捷地使用这些功能,实现数据库的高效运维与持续优化。
PolarDB产品使用问题之要验证MySQL迁移后的数据库数据与迁移前的数据一致性,该怎么办
|
16天前
|
存储 关系型数据库 MySQL
关系型数据库mysql数据文件存储
【6月更文挑战第15天】
20 4
|
23天前
|
关系型数据库 5G PostgreSQL
postgreSQL 导出数据、导入
postgreSQL 导出数据、导入
28 1