在postgresql中将列从字符串更改为字符串数组

时间:2013-02-08 22:09:53

标签: arrays database postgresql postgresql-9.2

以下是名为“containers”的表格的片段。

       Column       |            Type             |            Modifiers            
--------------------+-----------------------------+---------------------------------
 id                 | uuid                        | not null
 name               | character varying(255)      | 
 products           | character varying           | default '{}'::character varying

如何将products列更改为"character varying[]",将相应的修饰符更改为default '{}'::character varying[]?基本上,我想将字符串转换为字符串数组。请注意,products列对字符数没有限制。

alter table "containers" alter "products" type character varying[];

抛出以下错误

  

错误:列“产品”无法转换为类型字符变化[]

1 个答案:

答案 0 :(得分:17)

Postgres中没有varcharvarchar[]的隐式演员。 您必须指明如何执行类型转换。 您应该在USING expression子句中执行此操作(请参阅文档中的ALTER TABLE)。 在这种情况下,您必须删除并重新创建列的默认值,如文档中所述:

  

SET DATA TYPE的USING选项实际上可以指定涉及行的旧值的任何表达式;也就是说,它可以引用其他列以及正在转换的列。这允许使用SET DATA TYPE语法进行非常一般的转换。由于这种灵活性,USING表达式不适用于列的默认值(如果有的话);结果可能不是默认值所需的常量表达式。这意味着当没有从旧类型到新类型的隐式或赋值转换时,即使提供了USING子句,SET DATA TYPE也可能无法转换默认值。在这种情况下,使用DROP DEFAULT删除默认值,执行ALTER TYPE,然后使用SET DEFAULT添加合适的新默认值。

alter table containers alter products drop default;
alter table containers alter products type text[] using array[products];
alter table containers alter products set default '{}';

这三项操作可以在一个声明中完成:

alter table containers 
    alter products drop default,
    alter products type text[] using array[products],
    alter products set default '{}';