• PostgreSQL 序列(Sequence)


    基本操作

    --新增序列
    CREATE SEQUENCE xxx_id_seq INCREMENT 1 -- 一次加多少 MINVALUE 1 -- 最小值 START 1 --从多少开始 CACHE 1 CYCLE;
    
    --指定表使用
    alter table xxx_table alter column id set DEFAULT nextval('xxx_id_seq')
    
    --查询序列
    SELECT nextval('xxx_id_seq');
    
    --删除序列
    DROP SEQUENCE xxx_id_seq;
    
    --重置序列
    alter sequence xxx_id_seq restart with 1
    
    --修改序列(修改序列的最小值和最大值)
    ALTER SEQUENCE sequence_name MINVALUE new_min_value MAXVALUE new_max_value;
    

    serial数据类型

    在 PostgreSQL 中,serial 是一种特殊的数据类型,用于自动生成唯一标识符(通常用作自增主键)的列。
    serial 数据类型是一个伪类型,实际上是由以下两个类型组成:

    • integer:用于存储自增的数值。
    • sequence:用于生成唯一的数值序列。

    当你在表中定义了一个列为 serial 类型时,它将自动创建一个与该列关联的序列,并将默认值设为从该序列中获取的下一个值。每次插入新行时,这个序列会自动递增。

    CREATE TABLE example_table (
        id serial PRIMARY KEY,
        name text
    );
    

    虽然 serial 类型是一种方便的方式来创建自增主键列,但实际上它只是一种语法糖,底层仍然使用了 integer 类型和序列。因此,你也可以手动创建一个 integer 类型的列,并使用序列来生成唯一的值。

    序列溢出解决方案

    方法1:主键序列 int4 修改为 int8

    --创建表
    CREATE TABLE "linq_test" (
      "linq_test_id" serial NOT NULL ,
      "merchant_id" int4 NOT NULL,
      "sop_task_id" int4 NOT NULL
    )
    --主键修改为int8
    alter table linq_test alter linq_test_id type bigint;
    --修改序列类型,重置最大值
    ALTER SEQUENCE "linq_test_linq_test_id_seq" AS bigint MAXVALUE 9223372036854775807;
    

    方法2:重置序列

    重置前

    重置后

    新插入数据

    如何提前排查序列溢出

    --last_value 接近 max_value,表示序列快用完了 
    SELECT * FROM pg_sequences where last_value is not null 
    order by last_value  desc;
    

  • 相关阅读:
    华为设备ACL配置命令
    Java - 你真的明白单例模式怎么写了吗?
    mysql 8.0 date、datetime time, timestamp的区别
    德国大陆博世 ars 548 4D 毫米波雷达 window 系统或者 Ubuntu 系统通讯以及数据解析和显示程序
    Docker 搭建 Minio 容器 (完整详细版)
    接口自动化测试工具大全
    半小时了解SQL注入漏洞?(注入方式大全+绕过大全)
    Springboot中使用@JsonProperty和@JSONField
    有成效的工作
    Golang中的协程(goroutine)
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/17810316.html