将列类型从char更改为array

时间:2016-06-15 10:28:33

标签: postgresql alter

我在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可以输入...

1 个答案:

答案 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();