问题描述
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?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)