我在PostgreSQL中有一个包含character(1)
列的表,我希望将其更改为text[]
列,但我似乎无法使其正常工作:
ALTER TABLE public.mytable
ALTER COLUMN abc TYPE TEXT[] COLLATE pg_catalog."default"
USING ARRAY[abc];
给了我这个错误:
错误:列" abc"的默认值不能自动转换为输入文本[]
这是理解的,因为Postgres无法将NULL:bpchar
转换为数组。但是,我怎么能这样做呢?显然,NULL
可以输入...
答案 0 :(得分:1)
您需要删除默认值,更改数据类型并重新添加默认值 来自documentation:
(...)USING表达式未应用于列的默认值(如果有); (......)。
这意味着当没有从旧类型到新类型的隐式或赋值转换时,即使提供了USING子句,SET DATA TYPE也可能无法转换默认值。在这种情况下,使用DROP DEFAULT删除默认值,执行ALTER TYPE,然后使用SET DEFAULT添加合适的新默认值。
和给出的例子:
> When the column has a default expression that won't automatically cast to the
new data type:
ALTER TABLE foo
ALTER COLUMN foo_timestamp DROP DEFAULT,
ALTER COLUMN foo_timestamp TYPE timestamp with time zone
USING timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
ALTER COLUMN foo_timestamp SET DEFAULT now();