table 的 postgres 中主键的更新顺序有很多删除

Updating sequence for primary key in postgres for a table with a lot of deletions

我有以下问题:我有一个 table 有很多行的删除和插入。此外,我想为 table 中的每个当前行分配一些 ID 号。目前我正在尝试使用

DROP SEQUENCE IF EXISTS market_orders_seq
CREATE SEQUENCE market_orders_seq CACHE 1
CREATE TABLE market_orders (id int NOT NULL DEFAULT nextval('market_orders_seq') PRIMARY KEY, typ varchar(5), tag varchar(30), owner_id int, owner_tag varchar(5), amount int, price int, market_id int)
ALTER SEQUENCE market_orders_seq OWNED BY market_orders.id

但是如果我没有理解错的话,sequences是单调的,而且当我删除一些行的时候不能往下走,所以我遇到了ids膨胀得很快的问题。这个问题的解决方案是什么?我想为我的插入使用第一个未使用的 id,但我不知道该怎么做。

虽然这在技术上是可行的,但我实际上不建议这样做。

首先,一个整数值最多可以存储 2 个大约十亿的值,你可能不会命中 - 你仍然可以切换到 bigint,它可能会达到大约 1^19

此外,识别间隙需要为每个插入扫描 table,这是低效的([=23= 越大,效率越低)。

insert into market_orders(id, typ, ...)
select
    min(id) + 1,
    'foo',
    ...
from market_orders mo
where not exists(select 1 from market_orders mo1 where mo1.id = mo + 1)

旁注:你应该使用 the [big]serial datatype,所以你不需要自己处理序列。