我们在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
。
1条答案
按热度按时间zzwlnbp81#
您可以使用匿名块来为此生成必要的SQL。在该块中,从当前序列中获取
nevtval
,并将其(加上一些增量)用作新生成 sequence_option 的start with
值。然后在切换后放弃序列。参见demo here。