• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    postgresql 中的序列nextval详解

    一、postgresql中的序列

    1.1 场景需求

    需要向下图一样,需要对产品编码编码设置一个序列。编码规则 SKU + 序列号:

    1.2 序列

    序列是基于bigint算法的,因此范围是不能超过一个八字节 整数的范围(-9223372036854775808 到 9223372036854775807)。

    由于nextval和setval调用绝不会回滚, 如果需要序数的"无间隙"分配,则不能使用序列对象。可以 通过在一个只包含一个计数器的表上使用排他锁来构建无间隙的分配, 但是这种方案比序列对象开销更大,特别是当有很多事务并发请求序数时

    创建和使用语法:

    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函数,还有另一种方法也是修改sequence的start_value,也是会更新序列的当前值:

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

    alter sequence s_seq restart with 2

    相当于

    select setval('s_seq',2,false)

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • PostgreSQL Sequence序列的使用详解
    • PostgreSQL 序列绑定字段与不绑定字段的区别说明
    • PostgreSQL 序列增删改案例
    • postgresql重置序列起始值的操作
    • postgresql 实现更新序列的起始值
    • postgresql修改自增序列操作
    • Postgresql数据库之创建和修改序列的操作
    上一篇:PostgreSQL 序列绑定字段与不绑定字段的区别说明
    下一篇:PostgreSQL ROW_NUMBER() OVER()的用法说明
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    postgresql 中的序列nextval详解 postgresql,中的,序列,nextval,