如何将数据类型从BIGSERIAL修改为String?

问题描述 投票:0回答:1

我尝试执行这个sql:

ALTER TABLE a_table ALTER COLUMN a_id TYPE VARCHAR(255) USING (a_id::VARCHAR(255))

其中 a_id 是 BIGSERIAL,但出现错误:

错误:标识列类型只能是smallint、integer或bigint

在一个表中我有ID(也有bigserial),使用BIGSERIAL作为a_id是错误的(这不是约束)

UPD:由于此列中的数据,我无法删除列以重新创建

sql postgresql liquibase
1个回答
0
投票

如果您想这样做,请使用

psql
:

create table bigserial_test(id bigserial, fld_1 varchar);

\d bigserial_test
                                 Table "public.bigserial_test"
 Column |       Type        | Collation | Nullable |                  Default                   
--------+-------------------+-----------+----------+--------------------------------------------
 id     | bigint            |           | not null | nextval('bigserial_test_id_seq'::regclass)
 fld_1  | character varying |           |          | 


insert into bigserial_test (fld_1) values ('cat'), ('dog'), ('fish');

select * from bigserial_test;
 id | fld_1 
----+-------
  1 | cat
  2 | dog
  3 | fish

使用 CASCADE 将序列拖放到

id
列上。这破坏了列和序列之间的关系。这就是您的错误 ERROR: Identity column type can only besmallint, integer, or bigint 的来源。

drop sequence bigserial_test_id_seq cascade;

 \d bigserial_test
                Table "public.bigserial_test"
 Column |       Type        | Collation | Nullable | Default 
--------+-------------------+-----------+----------+---------
 id     | bigint            |           | not null | 
 fld_1  | character varying |           |          | 

此时,您可以将该列保留为常规

bigint
类型。

如果你想做到

varchar
,请执行以下操作。尽管我不确定将整数更改为字符串确实是一个好主意。请注意没有指定长度的
varchar
。这是一个 Postgres 扩展。

alter table bigserial_test alter COLUMN id type varchar;

 \d bigserial_test
                Table "public.bigserial_test"
 Column |       Type        | Collation | Nullable | Default 
--------+-------------------+-----------+----------+---------
 id     | character varying |           | not null | 
 fld_1  | character varying |           |          | 



© www.soinside.com 2019 - 2024. All rights reserved.