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[];

次のエラーをスローします

エラー:列「products」を型文字variing[]にキャストできません

4

1 に答える 1

32

Postgresにはfromからvarchartoへの暗黙のキャストはありません。varchar[]タイプの変換を実行する方法を指定する必要があります。USING expression句でそれを行う必要があります(ドキュメントのALTER TABLEを参照してください)。その場合、ドキュメントで説明されているように、列のデフォルト値を削除して再作成する必要があります。

SET DATA TYPEのUSINGオプションは、実際には、行の古い値を含む任意の式を指定できます。つまり、変換される列だけでなく、他の列も参照できます。これにより、SETDATATYPE構文を使用して非常に一般的な変換を実行できます。この柔軟性のため、USING式は列のデフォルト値(存在する場合)には適用されません。結果は、デフォルトで必要な定数式ではない場合があります。これは、古い型から新しい型への暗黙的または割り当てキャストがない場合、USING句が指定されていても、SETDATATYPEがデフォルトの変換に失敗する可能性があることを意味します。このような場合は、DROP DEFAULTを使用してデフォルトを削除し、ALTER TYPEを実行してから、SETDEFAULTを使用して適切な新しいデフォルトを追加します。

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

3つの操作を1つのステートメントで実行できます。

alter table containers 
    alter products drop default,
    alter products type text[] using array[products],
    alter products set default '{}';
于 2013-02-08T22:29:54.613 に答える