将BIGSERIAL转换为BIGINT

3

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

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

这会导致一个带有一个名为b_id的列的表,它是一个BIGSERIAL类型并且是从a表到b表的外键。但是这是不正确的,我需要改变表格(安全地)以去除SERIAL部分并将其保留为BIGINT。(实际上,如果有一个插入不指定值,那么该列不应插入自动递增的数字。)
文档显示, SERIAL 只是向底层数据类型添加一个序列。如果您想从基于整数的类型移动到基于序列的类型,则可以手动执行此操作,但反之则没有类似的结果。文档说:

您可以在不删除列的情况下删除序列,但这将 强制删除列默认表达式。

但是 DROP SEQUENCE 的文档在使用名称和效果方面非常简单。
  • 我能够安全地 DROP SEQUENCE b_id 以获得所需的结果(即 b_id 是一个简单的BIGINT列吗?)
  • 我是否需要执行其他操作以使表处于安全状态,并且不会破坏值?
1个回答

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

嗯。所以,我正在尝试这个,并得到了 Syntax error in SQL statement "DROP SEQUENCE IMAGE_EXPERIMENT_ID_SEQ CASCADE[*] "; 的错误。 - Nathaniel Ford
你是在输入 [*] "; 吗?如果没有,请尝试不使用 CASCADE - Daniel Lyons
我不是。DROP SEQUENCE IF EXISTS image_experiment_id_seq RESTRICT; 也会出现语法错误。但它是在使用 Flyway 运行的,所以可能有些奇怪的东西。 - Nathaniel Ford
我不知道Flyway是什么。无论如何,这是正确的语法,所以我不知道还有什么可以告诉你的。 - Daniel Lyons
我认为是http://flywaydb.org/的问题。某些东西被搞乱了:语法直接运行是可以的。谢谢! - Nathaniel Ford
具体来说,事实证明它还创建了一个h2数据库,该数据库不支持CASCADERESTRICT - Nathaniel Ford

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