PostgreSQL 序列字段达到最大值
背景说明:有这样一个表 cz_bcq1_log,在表定义的时候没有考虑到数据的增长问题,随着系统的运行,现在遇到一个棘手的问题,就是 id 达到最大值了,现在无法对表进行插入操作。
下面是表的 DDL 定义:
CREATE TABLE "public"."cz_bcq1_log" (
"id" int2 NOT NULL DEFAULT nextval('cz_bcq1_log_id_seq'::regclass),
"bcq01" int8 NOT NULL,
"bck01a" int4 DEFAULT 0,
"bcq03" varchar(10) COLLATE "pg_catalog"."default",
"bcq04" varchar(20) COLLATE "pg_catalog"."default",
"bby01" int8,
"bcq09" int2,
"bcq11" varchar(128) COLLATE "pg_catalog"."default",
"bcq13" int2,
"bcq15" int2,
"bcq17" timestamp(6),
"bcq18" varchar(20) COLLATE "pg_catalog"."default",
"bcq19" timestamp(6),
"bcq20" varchar(20) COLLATE "pg_catalog"."default",
"bcq21" int4,
"bcq22" int4,
"bcq23" int4,
"ctime" timestamp(0),
CONSTRAINT "cz_bcq1_log_pkey" PRIMARY KEY ("id")
);
ALTER TABLE "public"."cz_bcq1_log" OWNER TO "postgres";
表插入数据提示如下:
INSERT INTO "public"."cz_bcq1_log" ("bcq01", "bck01a", "bcq03", "bcq04", "bby01", "bcq09", "bcq11", "bcq13", "bcq15", "bcq17", "bcq18", "bcq19", "bcq20", "bcq21", "bcq22", "bcq23", "ctime") VALUES (142, 53, '955', '955', 11874, 0, NULL, 1, 0, '2021-07-27 17:29:17.219', '高鑫', '2021-07-27 17:29:17.219', '高鑫', NULL, NULL, NULL, '2024-06-12 14:40:27');
ERROR: nextval: reached maximum value of sequence "cz_bcq1_log_id_seq" (32767)
问题解决:
方案执行一
-- 首先需要创建一个新的 bigserial 类型字段,并将其命名为一个新的名称比如 new_id
ALTER TABLE cz_bcq1_log ADD COLUMN new_id bigserial;
-- 接下来可以使用一个更新语句来更新表中新字段的值
UPDATE cz_bcq1_log SET new_id = id;
-- 删除旧的 id 字段
ALTER TABLE cz_bcq1_log DROP COLUMN id;
-- 将新字段更名为原字段名 id
ALTER TABLE cz_bcq1_log RENAME COLUMN new_id TO id;
-- 最后需要为新的 bigserial 类型字段创建一个序列。PostgreSQL 在创建 bigserial 类型字段时会自动创建对应的序列,因此只需要执行以下命令来获取新序列的名称并在需要时对其进行管理。
SELECT pg_get_serial_sequence('cz_bcq1_log', 'id');