将 BIGSERIAL 转换为 BIGINT
·
问题:将 BIGSERIAL 转换为 BIGINT
我有一个跨两个脚本定义的表,如下所示(我省略了不需要的细节):
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
列?) -
在不破坏值的情况下,我是否必须做任何其他事情才能使表格进入安全状态?
解答
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)
更多推荐
所有评论(0)