postgresql 从串行迁移到标识

okxuctiv  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(1)|浏览(427)

我们在Postgres 14 DB中有一个表,其ID是使用SERIAL创建的,我们希望迁移到使用IDENTITY。那个表已经有很多条目在prod中了。我们如何安全地迁移到IDENTITY?
我做了一些研究,找到了一个可能有帮助的脚本,但测试后,结果并不像我预期的那样...

INSERT INTO public.another_table (<columns>) VALUES (<values>);

ALTER TABLE public.another_table
    ALTER COLUMN id DROP DEFAULT;

DROP SEQUENCE public.another_table_id_seq;

ALTER TABLE public.another_table
    ALTER COLUMN id SET DATA TYPE INT;

ALTER TABLE public.another_table
    ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY;

INSERT INTO public.another_table (<columns>) VALUES (<values>);

如果你这样做了,postgres会发出如下消息:ERROR: duplicate key value violates unique constraint

zzwlnbp8

zzwlnbp81#

您可以使用匿名块来为此生成必要的SQL。在该块中,从当前序列中获取nevtval,并将其(加上一些增量)用作新生成 sequence_optionstart with值。然后在切换后放弃序列。参见demo here

do $$
declare 
  l_gen_start text = format('alter table users alter column user_id add generated by default as identity (start with %s);'
                           ,nextval('<current sequence name>')+100  -- some value above current 
                           );                       
begin
  alter table users alter column user_id drop default;
  raise notice '%', l_gen_start; 
  execute l_gen_start;
  drop sequence users_user_id_seq;
  commit; 
end; 
$$;

相关问题