我有一个表,它有一个id列,并指定如下:
CREATE TABLE foo
(
id integer NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1 ),
name text,
description text,
CONSTRAINT foo_pkey PRIMARY KEY (id)
)我经常更新这个表(每5分钟更新一次),但我使用的是“关于冲突,什么都不做”。
正如在本文中所描述的,serial in postgres is being increased even though I added on conflict do nothing预期id将使用此设置递增。
然而,基于这篇文章,What happens to the primary key Id when it goes over the limit?,我确实需要担心计数器超过限制。
如何防止此场景中发生错误?
要明确的是,我不需要这些值是空白的,也不一定需要有顺序的值,我只需要唯一性,我希望能够使用尽可能小的数据类型(我想在某个时候切换到smallint )。
我可以看到可能的解决办法:
H 221G 222。更新
迄今为止:
。
就我的具体情况而言,我想进一步确定备选案文1是否比备选案文4更好:
带有id的
F 247
在这种情况下,考虑到对表进行的不频繁更新以及在本例中存储id的空间使用情况,选择选项4比选项1更好吗?
发布于 2021-06-02 15:53:55
我认为正确的解决方案是另一个解决方案:将identity列的数据类型更改为bigint。然后你就不会用完序列值。
使用简单的ALTER TABLE执行该更改将重写它,并在语句的持续时间内锁定它。有更复杂的方法可以用较少的时间来完成,例如,请参见this answer。
https://stackoverflow.com/questions/67808320
复制相似问题