一个有大量删除的表在postgres中主键的sql更新序列

alen0pnh  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(295)

我有以下问题:我有一个表,表中有很多行的删除和插入。我还想给表中的每一行分配一些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

但是如果我理解正确的话,序列是单调的,当我删除一些行时不能向下,所以我遇到了一个ID膨胀得很快的问题。这个问题的解决办法是什么?我想使用我的插入第一个未使用的id,但我不知道怎么做。

icnyk63a

icnyk63a1#

虽然这在技术上是可行的,但我并不建议这样做。
首先,一个整数值可以存储高达20亿左右的值,你可能不会碰到它,而且你仍然可以切换到 bigint ,可能达到 1^19 .
另外,要确定这些间隙,需要扫描表中的每个插入,这是低效的(表越大,效率越低)。

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)

旁注:您应该使用 [big]serial 数据类型,所以您不需要自己处理序列。

相关问题