运维开发网

postgresql中序列nextval的详细介绍

运维开发网 https://www.qedev.com 2022-04-30 16:00 出处:网络
这篇文章主要介绍了postgresql 中的序列nextval详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 一、postgresql中的序列1.1 场景需求

这篇文章主要介绍了postgresql 中的序列nextval详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 一、postgresql中的序列1.1 场景需求

如下图所示,您需要设置产品代码的顺序。编码规则SKU+序列号:


1.2 序列

序列基于bigint算法,所以范围不能超过一个八字符整数的范围(-922372036854775808到922372036854775807)。

由于nextval和setval调用永远不会回滚,所以如果需要序数的“无缝”分配,就不能使用sequence对象。您可以在只包含一个计数器的表上使用排他锁来构造无缝分配,但是这种方案比顺序对象开销更大,尤其是当有许多事务同时请求序数时。

并创建和使用语法:

CREATE SEQUENCE serial START 101;SELECT nextval('serial'); nextval--------- 101

本节描述用于操纵序列对象的功能,这些对象也称为序列发生器或序列。

序列是使用CREATE SEQUENCE创建的特殊单行表。

序列通常用于为表中的行生成唯一标识符。

表中列出的这些序列函数可以为我们从序列对象中获取连续序列值提供一个简单且多用户安全的方法。


获得的序列值是安全的,并且可以与其他密钥组合形成唯一的主键。

新增:PostgreSQL中的序列相关函数nextval,currval,lastval,setval和setval

PostgreSQL中序列主要涉及到的函数是 函数 返回类型 描述 nextval(regclass) bigint 递增序列对象到它的下一个数值并且返回该值。这个动作是自动完成的。即使多个会话并发运行nextval,每个进程也会安全地收到一个唯一的序列值。 currval(regclass) bigint 在当前会话中返回最近一次nextval抓到的该序列的数值。(如果在本会话中从未在该序列上调用过 nextval,那么会报告一个错误。)请注意因为此函数返回一个会话范围的数值,而且也能给出一个可预计的结果,因此可以用于判断其它会话是否执行过nextval。 lastval() bigint 返回当前会话里最近一次nextval返回的数值。这个函数等效于currval,只是它不用序列名为参数,它抓取当前会话里面最近一次nextval使用的序列。如果当前会话还没有调用过nextval,那么调用lastval将会报错。 setval(regclass, bigint) bigint 重置序列对象的计数器数值。设置序列的last_value字段为指定数值并且将其is_called字段设置为true,表示下一次nextval将在返回数值之前递增该序列。 setval(regclass, bigint, boolean) bigint 重置序列对象的计数器数值。功能等同于上面的setval函数,只是is_called可以设置为true或false。如果将其设置为false,那么下一次nextval将返回该数值,随后的nextval才开始递增该序列。

请注意,当序列名称中有大写字母时,regclass参数值需要用双引号和单引号括起来,例如:

select nextval('"ACT_ChecklistItem_Id_seq"');

除了setval函数,另一个方法是修改序列的start_value,这也将更新序列的当前值:

需要在项目部署的时候插入一些基础数据,所以新增数据的ID不是从1开始,序列的start_value是修改的(下次执行nextval的时候会得到start_value而不是start_value+1)。

alter sequence s_seq restart with 2

胜任

select setval('s_seq',2,false)

以上个人经验,希望能给你一个参考,也希望你能支持一下搜源网。如有错误或不足之处,请不吝赐教。


0

精彩评论

暂无评论...
验证码 换一张
取 消