以下是名为“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[];
抛出以下错误
错误:列“产品”无法转换为类型字符变化[]
答案 0 :(得分:17)
Postgres中没有varchar
到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 '{}';