Sql 在postgres中使用select INDER alter table语句的结果

Sql 在postgres中使用select INDER alter table语句的结果,sql,postgresql,max,auto-increment,Sql,Postgresql,Max,Auto Increment,我有一个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 Fr

我有一个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;
现在,我运行第一个查询来获取Maxid+1值,然后需要在ALTER查询中替换它。
有没有办法存储SELECT的结果并在ALTER语句中使用变量?

这里有一种方法:

select setval(pg_get_serial_sequence('Table_1', 'id'), coalesce(max(id),0) + 1, false) 
from Table_1;
理由:

pg_get_serial_sequence返回给定表和列的序列名称 set_val可用于重置序列 这可以包装在一个select中,该select为您提供表中id的当前最大值,如果表为空,则为1
我有点迷路了。为什么要设置id列的值?您能更好地描述您试图解决的问题吗?因此,我正在将数据迁移到postgres中,Id列定义为始终生成的标识。迁移后,Id列出错,无法自动生成唯一值。因此,作为修复,我尝试使用上述两个查询重新启动序列,我必须对大约20个表执行此操作。如果我理解您的问题,您尝试将子查询用作ALTER语句的一部分,我认为这是不可能的。但是,如果您试图调整的ID是postgres序列,则应该能够更改该值。看到这个答案:谢谢。这是有用的。id字段定义为:id bigint NOT NULL始终作为标识增量1 START 1 MINVALUE 1 MAXVALUE 9223372036854775807缓存1生成,因此,我必须首先使用pg_get_serial_sequence函数获取序列名,然后使用以下命令设置值:select setval'table_1_id_seq',从notificationrequest中选择maxid+1,false