2013-02-08 3 views
9

Das folgende ist ein Ausschnitt einer Tabelle namens "Container".Ändern einer Spalte von String zu String Array in Postgresql

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

Wie kann ich die products Spalte "character varying[]" und die entsprechenden Modifikatoren default '{}'::character varying[] ändern? Im Wesentlichen möchte ich einen String in ein String-Array konvertieren. Beachten Sie, dass in der Produktspalte die Anzahl der Zeichen nicht begrenzt ist.

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

führt den folgenden Fehler

ERROR: column "products" cannot be cast to type character varying[]

Antwort

11

Es gibt keine implizite Umwandlung varchar-varchar[] in Postgres ist. Sie müssen angeben, wie die Konvertierung der Typen durchgeführt werden soll. Sie sollten es in USING expression Klausel tun (siehe ALTER TABLE in der Dokumentation). In diesem Fall müssen Sie den Standardwert der Spalte löschen und neu erstellen, wie es in der Dokumentation erklärt:

The USING option of SET DATA TYPE can actually specify any expression involving the old values of the row; that is, it can refer to other columns as well as the one being converted. This allows very general conversions to be done with the SET DATA TYPE syntax. Because of this flexibility, the USING expression is not applied to the column's default value (if any); the result might not be a constant expression as required for a default. This means that when there is no implicit or assignment cast from old to new type, SET DATA TYPE might fail to convert the default even though a USING clause is supplied. In such cases, drop the default with DROP DEFAULT, perform the ALTER TYPE, and then use SET DEFAULT to add a suitable new 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 '{}'; 

Die drei Operationen in einer Anweisung durchgeführt werden kann:

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

Danke. Getting cast error though - FEHLER: Standard für die Spalte "products" kann nicht umgewandelt werden, um Text einzugeben [] – papdel

+0

Funktion erstellen oder ersetzen string_to_string_array (Wertzeichen variiert) gibt Zeichen zurück variierende [] Sprache sql als $$ Array auswählen [$ 1] $$; und dann alter table "containers" ändern "products" type character variating [] mit string_to_string_array (products); warf den gleichen Fehler auch. – papdel

+0

Wie ändere ich auch den vorhandenen Standardwert? – papdel