【问题标题】:Can you create a sequence on a column that already exists in Postgres您可以在 Postgres 中已存在的列上创建序列吗
【发布时间】:2014-09-22 11:07:56
【问题描述】:

我有一个表 linelevelpmts,其中有一列 seq (Int4) 将用作序列。

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

ALTER TABLE "public"."linelevelpmts" ALTER COLUMN "seq" SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass);

此代码生成错误:关系 linelevelpmts_seq_seq 不存在。

【问题讨论】:

  • 将列用作序列”并没有真正的意义。您不会像序列一样使用列。您从序列中提供它们的默认值。
  • 该表是在数据导入期间以编程方式创建的。我知道我可以删除表并重新创建它,我只是想知道是否有其他方法。
  • @kipsoft 序列不是列。它是数据库中的一个单独对象,用于生成序列号(无论出于何种目的)。序列可以用作列的默认值(称为SERIAL 数据类型)。

标签: postgresql sequence


【解决方案1】:

此代码生成错误:关系 linelevelpmts_seq_seq 不存在。

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

create sequence linelevelpmts_seq_seq;
ALTER TABLE public.linelevelpmts 
    ALTER COLUMN seq SET DEFAULT nextval('linelevelpmts_seq_seq'::regclass);

如果您想要与创建为serial 相同的效果,您还需要更改序列的“所有者”:

alter sequence linelevelpmts_seq_seq owned by linelevelpmts.seq;

编辑

Igor 的评论很好:如果seq 列中已有值,则应调整序列的起始值:

select setval('linelevelpmts_seq_seq', (select max(seq) from linelevelpmts));

【讨论】:

  • 谢谢!这正是我想要的。
  • @kipsoft 您可能还需要将创建的序列设置为max(seq) from linelevelpmts。否则 nextval('linelevelpmts_seq_seq') 将产生从 1 开始的值(与 linelevelpmts 中已有的值重复)。
  • @IgorRomanchenko:谢谢,很好。我添加了一个关于如何调整序列当前值的示例。
  • 创建序列时也可以使用... START WITH <starvalue>
  • @vyegorov:是的,但您无法提供要使用的值的查询。
猜你喜欢
  • 2015-04-04
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-02-08
  • 2011-03-29
  • 1970-01-01
相关资源
最近更新 更多