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

问题描述 投票:1回答:1

我有以下问题:我有一个表,其中包含许多行的删除和插入。另外,我想为表中的每个当前行分配一些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用于插入,但是我不知道该怎么做。

sql postgresql primary-key sql-insert auto-increment
1个回答
1
投票

虽然这在技术上是可行的,但实际上我不建议您采用这种方式。

[首先,一个整数值最多可以存储2个大约十亿的值,您可能不会找到它-而且您仍然可以切换到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)

旁注:您应该使用the [big]serial datatype,因此您无需自己处理序列。

© www.soinside.com 2019 - 2024. All rights reserved.