web-dev-qa-db-ja.com

PostgreSQLで列挙型アイテムの名前を変更します

PostgreSQL9.1.5で列挙型のアイテムの名前を変更したいと思います。

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

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

「作成されたタスク」を「中止」に変更したいだけです。 documentation から、次のように機能するようです:

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

しかし、私はメッセージを受け取ります:

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

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

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

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

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

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

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

38
David S

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

残念ながら、列挙型ラベルの変更は簡単ではありません。システムカタログをいじくりまわす必要があります: 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'
)
34

PostgreSQLバージョン10では、列挙型のラベルの名前を変更する機能 追加されましたALTER TYPE 構文の一部として:

ALTER TYPE name RENAME VALUE existing_enum_value TO new_enum_value
53
cstroe

受け入れられた回答のクエリは、スキーマ名を考慮していません。 http://tech.valgog.com/2010/08/alter-enum-in-postgresql.html に基づいて、より安全な(そしてより単純な)ものを次に示します。

UPDATE pg_catalog.pg_enum
SET enumlabel = 'NEW_LABEL'
WHERE enumtypid = 'SCHEMA_NAME.ENUM_NAME'::regtype::oid AND enumlabel = 'OLD_LABEL'
RETURNING enumlabel;

これには「rolcatupdate」(カタログを直接更新する)権限が必要であることに注意してください。スーパーユーザーであっても十分ではありません。

PostgreSQL 9.3の時点では、カタログを直接更新することがまだ唯一の方法のようです。

11
EM0

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

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

thatを実行したら、列挙にvaluesを追加できます。

ALTER TYPE import_action 
ADD VALUE 'Aborted';

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

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

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