我有以下问题:我有一个表,表中有很多行的删除和插入。我还想给表中的每一行分配一些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,但我不知道怎么做。
1条答案
按热度按时间icnyk63a1#
虽然这在技术上是可行的,但我并不建议这样做。
首先,一个整数值可以存储高达20亿左右的值,你可能不会碰到它,而且你仍然可以切换到
bigint
,可能达到1^19
.另外,要确定这些间隙,需要扫描表中的每个插入,这是低效的(表越大,效率越低)。
旁注:您应该使用
[big]serial
数据类型,所以您不需要自己处理序列。