您可以在Postgres中已存在的列上创建序列吗?

kip*_*oft 2 postgresql sequence

我有一个linelevelpmts带有列seq(Int4)的表,它将用作序列.

我知道我可以删除该列并将其重新创建为类型序列,但是我可以修改现有列以用作序列.

ALTER TABLE "public"."linelevelpmts" ALTER COLUMN "seq" SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass);
Run Code Online (Sandbox Code Playgroud)

此代码生成错误:Relation linelevelpmts_seq_seq不存在.

a_h*_*ame 12

此代码生成错误:Relation linelevelpmts_seq_seq不存在.

那么你需要先创建你想要用作默认值的序列:

create sequence linelevelpmts_seq_seq;
ALTER TABLE public.linelevelpmts 
    ALTER COLUMN seq SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass);
Run Code Online (Sandbox Code Playgroud)

如果你想同样的效果,如果它创建为serial你还需要更改序列的"主人":

alter sequence linelevelpmts_seq_seq owned by linelevelpmts.seq;
Run Code Online (Sandbox Code Playgroud)

编辑

伊戈尔的评论是一个很好的一个:如果你已经列中的值seq,你应该调整序列的起始值:

select setval('linelevelpmts_seq_seq', (select max(seq) from linelevelpmts));
Run Code Online (Sandbox Code Playgroud)

  • @kipsoft您可能还需要将创建的序列设置为来自linelevelpmts的`max(seq).否则`NEXTVAL( 'linelevelpmts_seq_seq')`将产生从1(重复在`linelevelpmts`与值的话)的起始值. (2认同)