我的表包含一个可以为空的整数列(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命令来进行转换。代码示例将不胜感激......
答案 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
这一切。