PostgreSQL自增序列手工设置主键+自动生成主键融合使用
2021/11/20 2:11:54
本文主要是介绍PostgreSQL自增序列手工设置主键+自动生成主键融合使用,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
场景描述
在最近的工作中,遇到了一个自增队列使用的问题,记录一下解决过程和方案。
文章参考了: PostgreSQL自增序列-主键冲突问题_子木倾然的博客-CSDN博客查询全部序列:select * from pg_class where relowner=(select usesysid from pg_user where usename='postgres') and relkind='S'创建序列CREATE SEQUENCE t_app_app_id_seq INCREMENT 1 MINVALUE 1 MAXVALUE 9999...https://blog.csdn.net/qq_23021275/article/details/89396653
针对某个业务表 (user),包含三列:id 、code、name,其中id列为主键列,使用自增序列方式,目前存在业务功能(用户维护1),在用户维护新增用户保存时,主键通过自增序列自动生成 ,写法如下:
(insert into user(code,name) values('admin','系统管理员') returning id; --通过自增序列生成id,并且使用returning id 将生成的主键返回
现在需要使用某框架做一个新的用户维护功能(用户维护2),并且两套功能要同时使用,由于框架限制,新增的数据的主键需要在插入数据(insert)之前就得到,这样就无法使用如上SQL来处理了。
因为两个功能要同时使用,并且用户维护1功能逻辑不能改变,两套功能新增的user数据主键不能冲突。
解决过程
第一次尝试
在用户维护2中,使用序号提前得到下一个序列(假如得到的结果10):
SELECT ,MAX(id)+1 FROM user;
然后在保存时,将得到的下一个序列值插入到数据库中:
insert into user(id,code,name) values(10,'code11','name11')
新功能测试好使,但是在一起使用时,出现了问题:在用户维护1中,新增的数据,自增序列生成的主键值,也会生成10,结果与用户维护2新增的数据出现主键冲突。
问题分析:貌似如下sql并没用把序列的占用值更新,所以10仍然可用。
正确方案
在获取主键值时,使用如下sql,在获取下一个主键时,及时更新自增序列的当前值,这样用户维护1新增数据时,才会跳过已经获取到的主键,避免主键冲突:
SELECT setval('自增序列名',nextval('自增序列名'),true) FROM user;
注:本来打算使用参考文档中的如下写法来获取主键,但是貌似如下写法也并未更新自增序列的最大号
SELECT setval('自增序列名',MAX(id)+1,true) FROM user;
这篇关于PostgreSQL自增序列手工设置主键+自动生成主键融合使用的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-01-05快速清空 PostgreSQL 数据库中的所有表格,让你的数据库重新焕然一新!
- 2024-01-04在PostgreSQL中创建角色:判断角色是否存在并创建
- 2023-05-16PostgreSQL一站式插件推荐 -- pg_enterprise_views
- 2022-11-22PostgreSQL 实时位置跟踪
- 2022-11-22如何将PostgreSQL插件移植到openGauss
- 2022-11-11PostgreSQL:修改数据库用户的密码
- 2022-11-06Windows 环境搭建 PostgreSQL 物理复制高可用架构数据库服务
- 2022-10-27Windows 环境搭建 PostgreSQL 逻辑复制高可用架构数据库服务
- 2022-10-11PostgreSql安装(Windows10版本)
- 2022-09-13PostgreSQL-Network Address类型操作和函数