每次更新后,PostgreSQL自动增量都会增加
每次我执行INSERT或UPSERT(在冲突更新时),每个表上的增量列都会按之前的更新次数递增 例如,如果我有这个表:每次更新后,PostgreSQL自动增量都会增加,postgresql,Postgresql,每次我执行INSERT或UPSERT(在冲突更新时),每个表上的增量列都会按之前的更新次数递增 例如,如果我有这个表: id int4 title text description text updated_at timestamp created_at timestamp 然后运行以下查询: INSERT INTO notifications (title, description) VALUES ('something', 'whatever'); // Generates increme
id int4
title text
description text
updated_at timestamp
created_at timestamp
然后运行以下查询:
INSERT INTO notifications (title, description) VALUES ('something', 'whatever'); // Generates increments ID=1
UPDATE notifications title='something else' WHERE id = 1; // Repeat this query 20 times with different values.
INSERT INTO notifications (title, description) VALUES ('something more', 'whatever again'); // Generates increments ID=22
这是一个相当大的问题。我们正在运行的脚本每天处理100000多个通知。这可能会在每个插入之间产生10000左右的间隙,因此我们可以从100行开始,但当我们达到1000行时,最后一行的主键ID值会自动增加到100000以上
如果这种情况继续下去,表中的自动增量值将很快用完
我们的PostgreSQL server是否配置错误?使用Postgres 9.5.3
我正在使用雄辩的模式生成器(例如,
$table->increments('id')
)创建表,我不知道这是否与此有关。无论插入成功与否,只要尝试插入,序列都将递增。简单的更新
(如您的示例中所示)不会增加它,但冲突更新时插入会增加它,因为在更新
之前尝试插入
一种解决方案是将id
更改为bigint
。另一种方法是不要使用序列并自己管理它。另一种方法是手动插入:
with s as (
select id
from notifications
where title = 'something'
), i as (
insert into notifications (title, description)
select 'something', 'whatever'
where not exists (select 1 from s)
)
update notifications
set title = 'something else'
where id = (select id from s)
这假设
标题
是唯一的。您可以在插入命令之前运行此命令,将自动增量列重置为最大插入值:
SELECT setval('notifications_id_seq', MAX(id)) FROM notifications;
“如果这种情况继续下去,表中的自动增量值将很快用完。”我对此表示怀疑。如果每秒24/7(无任何暂停)烧掉10.000个值,则需要29.247.120年才能用完(bigint)值