每次更新后,PostgreSQL自动增量都会增加

每次更新后,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

每次我执行INSERT或UPSERT(在冲突更新时),每个表上的增量列都会按之前的更新次数递增

例如,如果我有这个表:

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)值