【发布时间】:2020-05-05 17:48:46
【问题描述】:
我有一个定义如下的 postgres 表:
CREATE TABLE public.Table_1
(
id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1
START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 )
)
由于数据迁移,id 列被弄乱了,在 INSERT 上生成的 id 的值不是唯一的。因此,我需要如下重置 id 列
SELECT MAX(id) + 1 From Table_1;
ALTER TABLE Table_1 ALTER COLUMN id RESTART WITH 935074;
现在我运行第一个查询以获取 Max(id) + 1 值,然后我需要在 ALTER 查询中替换它。 有没有办法存储 SELECT 的结果并在 ALTER 语句中使用变量?
【问题讨论】:
-
我有点迷路了。为什么要设置
id列的值?您能更好地描述您要解决的问题吗? -
所以,我正在将数据迁移到 postgres 中,并且 Id 列被定义为始终生成的标识。迁移后,Id 列搞砸了,它不会自动生成唯一值。因此,作为修复,我尝试使用上述 2 个查询重新启动序列,并且我必须对大约 20 个表执行此操作。
-
如果我理解您的问题,您正在尝试将子查询用作 ALTER 语句的一部分,我认为这是不可能的。但是,如果您尝试调整的 ID 是 postgres 序列,您应该能够更改该值。看到这个答案:stackoverflow.com/questions/2022559/…
-
谢谢。那很有用。 id 字段被定义为: id bigint NOT NULL GENERATED ALWAYS AS IDENTITY ( INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807 CACHE 1 ) 所以,我必须首先使用 pg_get_serial_sequence 函数获取序列名称,然后使用:select setval(' table_1_id_seq', (select max(id)+1 from notificationrequest), false)
标签: sql postgresql max auto-increment