2013-03-27 8 views
13

テーブルにvarcharカラムがあり、enumタイプにアップグレードする必要があります。postgresqlでvarcharカラムを列挙型にアップグレードする

varchar列のすべての値は、列挙の有効な値です。 varcharカラムにはnull値はありません。

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 

ERROR:列挙型を持つ別の新しい列を作成します

  1. に42804

    方法についてラウンドは:コラム "varcharColumnは" enum_type SQL状態を型にキャストすることはできません。

  2. タイプキャスト後に列挙型の列をvarchar列で更新します。
  3. varcharカラムを削除します。
  4. 列挙型の列名をvarchar列の名前に変更します。

これを実現する方法はありますか?

ありがとうございます。

答えて

24

使用できるデフォルトのキャストがないため、使用するキャストを定義する必要があります。

varcharColumn内のすべての値は、次のように動作するはずです、列挙型の定義に準拠している場合:

alter table foo 
    ALTER COLUMN varcharColumn TYPE enum_type using varcharColumn::enum_type; 

彼らは非常にunflexibleているので、私は個人的に列挙型が好きではありません。列の値を制限したい場合は、varchar列のチェック制約を優先します。または、値のリストが頻繁に変更され、成長する場合、外部キー制約を持つ古い「ルックアップテーブル」。

+0

また、ルックアップテーブルや単純な制約付きの列ではなく、一部のクライアントアプリケーションで作業する場合、列挙型の問題もより深刻です。 JPA/Hibernateの列挙型を使って作業するという嫌な喜びを持っている人は誰もが知っています。 –

+0

ありがとうa_horse_with_no_name!ドキュメントから解決策を見つけましたが、あなたの説明は非常に包括的かつ有用です。 – Gopal

+0

私は最近、列挙型をスキーマに移動することによって列挙型を再構成する必要がありました。そのため、列挙型に依存するテーブルは、列挙型の新しい場所を指すように型を変更する必要がありました。私は次のようにダブルキャストでそれを行いました: 'alter table my_schema.my_column alter column sale_item_status type my_schema.my_column_enum ((my_column :: text):: my_schema.my_column_enum)' - この性質の「問題」 –

3

ALTER TABLE tableName 
    ALTER COLUMN varcharColumn TYPE enum_type 
    USING varcharColumn::enum_type 

が正常に更新されます。

関連する問題