22

以下是名为“容器”的表的片段。

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

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

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

引发以下错误

错误:列“产品”不能转换为类型不同的字符 []

4

1 回答 1

32

Postgres中没有隐式转换 from varcharto varchar[]。您必须指明如何执行类型的转换。您应该在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 '{}';
于 2013-02-08T22:29:54.613 回答