PostgreSQL 序列(Sequence)

廣州大雄發表於2023-11-05

基本操作

--新增序列
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;

相關文章