0

我有一个具有以下结构的表:

CREATE TABLE web.cabinet_account_section (
    id serial NOT NULL,
    section_id text NULL,
    account_id int4 NULL,
    cabinet_param_id int4 NULL,
    CONSTRAINT cabinet_account_section_pkey PRIMARY KEY (id),
    CONSTRAINT cabinet_account_section_section_id_account_id_key UNIQUE (section_id),
    CONSTRAINT cabinet_account_section_account_id_fkey FOREIGN KEY (account_id) REFERENCES web.cabinet_account(id),
    CONSTRAINT cabinet_account_section_cabinet_param_id_fkey FOREIGN KEY (cabinet_param_id) REFERENCES web.cabinet_param(id)
);

该表每天更新。直到最近,该表才更新如下:如果UNIQUE section_id已经存在(即执行了常规的 SELECT EXISTS),则不需要添加任何内容。每天约有10,000个条目进入入口。

我决定用简单的 UPSERT 替换这个逻辑:

INSERT INTO web.cabinet_account_section (section_id, account_id, cabinet_param_id)
VALUES ('${view.id}', '${account.id}', 2)
ON CONFLICT DO NOTHING;

但随后串行字段出现了一个小问题。每次INSERT INTO查询时,id 序列号都会自动递增,即使没有插入任何记录。那些列中最后一个id是条件= 1800。昨天表中出现了几条新记录,id如下:2300、2560、8120、9982。今天id已经超过20,000。它尝试插入的那些,递增计数器,不插入,但不回滚计数器。

我认为,几个月后,即使不添加新行,它最终也会达到序列范围限制。

序列脚本:

CREATE SEQUENCE web.cabinet_account_id_seq
    INCREMENT BY 1
    MINVALUE 1
    MAXVALUE 2147483647
    START 1
    CACHE 1
    NO CYCLE;

有可能以某种方式解决这种情况吗?当您从表中删除一条记录并且某种 ID 消失时,这是一回事。但是即使没有插入任何行,这里的序列也会呈指数增长。或者我应该返回旧版本并检查这样的 section_id 是否已经存在?

4

0 回答 0