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

pap*_*del 14 database arrays postgresql postgresql-9.2

以下是名为"containers"的表格的片段.

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

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

alter table "containers" alter "products" type character varying[];
Run Code Online (Sandbox Code Playgroud)

抛出以下错误

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

kli*_*lin 17

没有来自隐式转换varcharvarchar[]Postgres里.您必须指明如何执行类型转换.您应该在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 '{}';
Run Code Online (Sandbox Code Playgroud)

这三个操作可以在一个语句中完成:

alter table containers 
    alter products drop default,
    alter products type text[] using array[products],
    alter products set default '{}';
Run Code Online (Sandbox Code Playgroud)