29

テーブルにvarchar列があり、列挙型にアップグレードする必要があります。

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

ALTER TABLE tableName
   ALTER COLUMN varcharColumn TYPE enum_type

エラー:列"varcharColumn"を型enum_typeSQL状態にキャストできません:42804

ラウンドアバウトの方法は

  1. 列挙型で別の新しい列を作成します。
  2. 型キャスト後、列挙型列をvarchar列で更新します。
  3. varchar列を削除します。
  4. 列挙型の列名をvarchar列名に変更します。

これを達成するためのより良い方法はありますか?

前もって感謝します。

4

3 に答える 3

51

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

のすべての値がvarcharColumn列挙型の定義に準拠している場合、以下が機能するはずです。

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

個人的には、列挙型は非常に柔軟性がないため、好きではありません。列の値を制限したい場合は、varchar列にチェック制約を設定することをお勧めします。または、値のリストが頻繁に変更されて大きくなる場合は、外部キー制約のある古き良き「ルックアップテーブル」。

于 2013-03-27T09:53:41.900 に答える
6

とった。

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

正常に更新されます。

于 2013-03-27T09:51:54.313 に答える
0

列挙型の順序付けプロパティが不要で、列挙型の削除値が欠落しているために問題が発生した場合は、ドメインタイプを検討することもできます。
ドメインタイプは、ユーザー定義タイプ+制約であり、CHECK&coを介して選択からxを可能にするため、enumのように扱いにくいものではありません。

典型的な列挙型は、たとえばログレベルですが、ドメイン(たとえば、フィールドが多くのテーブルに存在する電子メールテキスト入力の検証)です。

于 2020-04-08T13:49:35.897 に答える