52

PostgreSQL 9.1.5 で列挙型の項目の名前を変更したいと考えています。

タイプの create stmt は次のとおりです。

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

「Task created」を「Aborted」に変更したいだけです。documentationから、次のように動作するようです:

ALTER TYPE import_action
RENAME ATTRIBUTE "Task created" TO "Aborted"; 

ただし、次のメッセージが表示されます。

********** Error **********

ERROR: relation "import_action" does not exist
SQL state: 42P01

しかし、それは明らかに存在します。

タイプは現在、複数のテーブルで使用されています。

これを行う方法はあってはならないと考えています。pgAdminIII でタイプのダイアログを試しましたが、そこで名前を変更する方法がありません。(だから、私にはできないという強いヒントか、または-私が望んでいる-そのダイアログを作成した開発者の小さな見落としのいずれかです)

1つのステートメントでこれを行うことができない場合は? 次に、私は何をする必要がありますか?アイテムを追加し、すべてのレコードを新しい値に更新してから、古いアイテムを削除するスクリプトを作成する必要がありますか? それはうまくいきますか?

これは単純なことのようです。私が理解しているように、レコードはタイプとアイテムへの参照を格納しているだけです。私が与えたテキスト値を実際に保存しているとは思いません。でも、ここも間違っているかも。

4

4 に答える 4

43

更新: PostgreSQL バージョン 10 以降については、上位投票の回答を参照してください。

列挙値の名前はラベルと呼ばれ、属性はまったく別のものです。

残念ながら、列挙型ラベルの変更は簡単ではありません。システム カタログをいじる必要があります: http://www.postgresql.org/docs/9.1/static/catalog-pg-enum.html

UPDATE pg_enum SET enumlabel = 'Aborted' 
WHERE enumlabel = 'Task created' AND enumtypid = (
  SELECT oid FROM pg_type WHERE typname = 'import_action'
)
于 2012-09-27T19:04:39.757 に答える
7

タイプ、属性、および値には違いがあります。このような列挙型を作成できます。

CREATE TYPE import_action AS ENUM
('Ignored',
'Inserted',
'Updated',
'Task created');

それができたら、列挙型にを追加できます。

ALTER TYPE import_action 
ADD VALUE 'Aborted';

しかし、構文図は、値の削除または名前変更のサポートを示していません。あなたが見ていた構文は、値ではなく、属性の名前を変更するための構文でした。

このデザインはおそらく驚くべきものですが、意図的なものでもあります。pgsql-hackers メーリング リストから。

使用する値を変更する必要がある場合、または整数を知りたい場合は、代わりにルックアップ テーブルを使用してください。列挙型はあなたにとって間違った抽象化です。

于 2012-09-27T19:04:24.140 に答える