[pgsql-jp: 40911] Re: enum型の追加変更削除について

MauMau maumau307 @ gmail.com
2011年 9月 4日 (日) 07:30:58 JST


武田さん


MauMauといいます。

次のページにも書いてあるとおり、マニュアルで明示的に説明されている場合以外は、 

システムカタログを手作業で変更することは許されていません。
手作業の結果として期待した動作が得られたとしても、それは将来も保証されるものではありません。

http://www.postgresql.jp/document/current/html/catalogs.html

enum型に値を追加することは、9.1で可能になります。
9.0以前では、enum型の削除と再作成が必要です。
9.1では、たとえば次のような文で行えます。

ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';

上記の例は、次のページにあります。

http://www.postgresql.org/docs/9.1/static/sql-altertype.html



以上です。

----- Original Message ----- 
From: "武田 憲太郎" <takeda @ youmind.jp>
To: "'PostgreSQL Japanese Mailing List'" <pgsql-jp @ ml.postgresql.jp>
Sent: Sunday, September 04, 2011 12:33 AM
Subject: [pgsql-jp: 40910]enum型の追加変更削除について


> 武田と申します。こちらのMLで何度かお世話になっているものです。
>
> enum型の変更についてご質問です。
> 要素の追加方法について、alter type等を用いた追加方法は
> マニュアルに記載されていないのですが、
> 以下の方法で追加できることを確認しています。
>
> ===========================================
> # create type e as enum('a', 'b', 'c') ;
> # select 'd'::e;
> ERROR:  invalid input value for enum e: "d"
> LINE 1: select 'd'::e;
>               ^
> # select * from pg_enum ;
> enumtypid | enumlabel
> -----------+-----------
>     73755 | a
>     73755 | b
>     73755 | c
> (3 rows)
>
> # insert into pg_enum values(73755, 'd') ;
> INSERT 73759 1
> # select 'd'::e;
> e
> ---
> d
> (1 row)
> ===========================================
>
> 以上の動作は、仕様の範囲内の正常な動作でしょうか?
> それとも、保証外だがたまたま動いてるだけ、でしょうか?
>
> http://www.postgresql.jp/document/current/html/catalog-pg-enum.html
> ===========================================
> pg_enumカタログは、列挙型とそれが関連付けられている値とラベルを対応付けする項目を含みます。ある与えられた列挙値の内部表現は、実際にはpg_enum内の関連付けられた行のOIDです。特定の列挙型用のOIDは、その型がソートされる方法で並べられていることが保証されています。しかし、関連のない列挙型のOIDの並びについては保証はありません。
> ===========================================
>
> 「含む」旨は書かれているのですが「勝手に追加して良い」とか書かれてないので…。 
> 
>
> ===========================================
> # \dTS+ e
>                      List of data types
> Schema | Name | Internal name | Size | Elements | Description
> --------+------+---------------+------+----------+-------------
> public | e    | e             | 4    | a       +|
>        |      |               |      | b       +|
>        |      |               |      | c       +|
>        |      |               |      | d        |
> (1 row)
> ===========================================
>
> 一応、きちんと認識してくれて入るようです。
>
> ※既にどこからのテーブルに挿入されているenumlabelの行を削除した後
>  そのテーブルをselectしたところ
>  「ERROR: invalid internal value for enum: [oid]」となりました。
>
> ご存知の方がいらっしゃいましたらご教授頂けますと幸いです。
>



pgsql-jp メーリングリストの案内