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

武田 憲太郎 takeda @ youmind.jp
2011年 9月 4日 (日) 00:33:41 JST


武田と申します。こちらの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 メーリングリストの案内