将BIGSERIAL转换为BIGINT

时间:2015-12-11 20:38:53

标签: sql postgresql

我在两个脚本中定义了一个表,如下所示(我不需要详细信息):

CREATE TABLE a (id BIGSERIAL NOT NULL PRIMARY KEY);
ALTER TABLE IMAGE ADD COLUMN b_id BIGSERIAL;

这会产生一个包含b_idBIGSERIAL的表,并且是来自b的表a的外键。但是,这是不正确的,我需要(安全地)更改表格以放弃SERIAL部分并将其保留为BIGINT。 (基本上,如果有一个插件没有指定值,那么该列不应插入自动增加的数字。)

documentation表示SERIAL只是将一个序列添加到基础数据类型,如果要从基于整数的类型移动到另一个类型,有很多结果可以手动执行此操作基于串行的类型,但不是相反的。文档说:

  

您可以删除序列而不删除列,但这样做   强制删除列默认表达式。

但是DROP SEQUENCE的文档在使用什么名称以及它的影响方面非常轻松。

  • 我可以DROP SEQUENCE b_id安全地获得我想要的结果(b_id是一个简单的BIGINT列吗?)
  • 我是否还需要做任何其他事情才能让桌子进入安全状态,而不会破坏这些值?

1 个答案:

答案 0 :(得分:4)

BIGSERIAL已经BIGINT,它只会自动添加序列。如果你\d a,你可以看到它。你会看到这样的东西:

                         Table "public.a"
 Column |  Type  |                   Modifiers
--------+--------+------------------------------------------------
 id     | bigint | not null default nextval('a_id_seq'::regclass)
Indexes:
    "a_pkey" PRIMARY KEY, btree (id)

就在那里,您可以看到序列名称:a_id_seq。所以放弃它。

=# DROP SEQUENCE a_id_seq CASCADE;
NOTICE:  drop cascades to default for table a column id
DROP SEQUENCE

=# \d a
      Table "public.a"
 Column |  Type  | Modifiers
--------+--------+-----------
 id     | bigint | not null
Indexes:
    "a_pkey" PRIMARY KEY, btree (id)