【问题标题】:Using result of select inside alter table statement in postgres在postgres的alter table语句中使用select的结果
【发布时间】: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


【解决方案1】:

这是一种方法:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 2011-03-15
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多