如何填充可以为空的整数列并将其转换为Postgresql中的串行主键?

时间:2015-09-18 10:58:35

标签: postgresql primary-key

我的表包含一个可以为空的整数列(gid):

 gid | value
-------------
  0  |   a
     |   b
  1  |   c
  2  |   d
     |   e

现在,我想将gid列更改为SERIAL主键列。这意味着用新整数填充空槽。现有的整数必须保持不变。所以结果应该是这样的:

 gid | value
-------------
  0  |   a
  3  |   b
  1  |   c
  2  |   d
  4  |   e

我无法找到正确的SQL命令来进行转换。代码示例将不胜感激......

1 个答案:

答案 0 :(得分:3)

serial是"只是"从列中获取默认值的列。 假设您的表名为n1000,则以下内容将执行您想要的操作。

您需要做的第一件事就是创建该序列:

create sequence n1000_gid_seq;

然后你需要做出"默认"对于专栏:

alter table n1000 alter column gid set default nextval('n1000_gid_seq');

真正创建一个" serial"你还需要告诉它与列相关的序列:

alter sequence n1000_gid_seq owned by n1000.gid;

然后你需要推进序列,以便下一个值不会与现有值发生冲突:

select setval('n1000_gid_seq', (select max(gid) from n1000), true);

最后,您需要更新表中的缺失值:

update n1000 
  set gid = nextval('n1000_gid_seq')
where gid is null;

完成此操作后,您可以将列定义为PK:

alter table n1000 
   add constraint pk_n1000
   primary key (gid);

当然,如果你关闭了自动提交,你需要commit这一切。