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;