问题:将 BIGSERIAL 转换为 BIGINT

我有一个跨两个脚本定义的表,如下所示(我省略了不需要的细节):

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

这将生成一个表,其中列b_idBIGSERIAL,并且是来自a的表b的外键。但是,这是不正确的,我需要(安全地)更改表以删除SERIAL部分并将其保留为BIGINT。 (本质上,如果存在未指定值的插入,则该列不应插入自动递增的数字。)

文档表明SERIAL只是将序列添加到基础数据类型,如果您想从基于整数的类型移动到基于序列的类型,如何手动执行此操作有很多结果,但不是相反。文档说:

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

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

  • 我可以安全地得到我想要的结果DROP SEQUENCE b_id吗(那b_id是一个简单的BIGINT列?)

  • 在不破坏值的情况下,我是否必须做任何其他事情才能使表格进入安全状态?

解答

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)
Logo

PostgreSQL社区为您提供最前沿的新闻资讯和知识内容

更多推荐