我尝试执行这个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:由于此列中的数据,我无法删除列以重新创建
如果您想这样做,请使用
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 | | |