如何将主键从整数转换为序列?

10
在 Postgres 9.3 表中,我有一个带有自动序列递增的整数作为主键,但我已经达到了整数的最大值。如何将它从整数转换为序列(serial)?我尝试过:
ALTER TABLE my_table ALTER COLUMN id SET DATA TYPE bigint;

但是如果使用数据类型serial而不是bigint,情况就不同了。看起来我无法转换为serial


1
“但是它不工作”并不是一个合适的问题解释。 - zerkms
@zerkms 抱歉,我已经转换成bigint类型,但是我想要的是serial类型,如果这两种类型之间还有区别的话。 - Damir
如果您已经成功将主键转换为bigint,那么请添加一个默认值,为序列的第一个值加上最大值+1。 - Luc M
serial 是 4 字节,与 integer 具有相同的限制。参考:http://www.postgresql.org/docs/9.3/static/datatype-numeric.html - zerkms
你正在使用的语句已经将其转换为bigint。唯一缺少的是添加一个序列作为默认值,以防它不存在。 - Denis de Bernardy
1个回答

21

Serial是一种伪数据类型,而不是实际的数据类型。它在内部是一个integer,并自动执行一些额外的DDL命令:

  1. 创建一个SEQUENCE(默认情况下名称匹配)。
  2. 将列设置为NOT NULL,并将默认值设为从该序列中提取。
  3. 使该列拥有该序列。

详情请参见:

Bigserial与其相同,只是基于一个bigint列。如果想使用bigint,则已经实现了这一点。要将现有的serial列转换为bigserial(或smallserial),只需要更改列的数据类型即可。序列通常基于bigint,所以可以为任何integer类型使用相同的序列。

要将bigint更改为bigserialinteger更改为serial,只需要手动完成其余步骤:

  • 实际的数据类型仍然是integer/bigint
  • 如果满足所有serial的条件,一些客户端如pgAdmin会在反向工程化的CREATE TABLE脚本中显示数据类型serial

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接