问题:在postgres的alter table语句中使用select的结果

我有一个定义如下的 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 语句中使用变量?

解答

这是一种方法:

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中,它为您提供表中id的当前最大值(如果表为空,则为 1)

Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐