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

Itagaki Takahiro itagaki.takahiro @ gmail.com
2011年 9月 4日 (日) 09:56:09 JST


2011/9/4 武田 憲太郎 <takeda @ youmind.jp>:
> 要素の追加方法について、alter type等を用いた追加方法は
> マニュアルに記載されていないのですが、
> 以下の方法で追加できることを確認しています。

> # insert into pg_enum values(73755, 'd') ;

問題があるとすれば、pg_enum テーブルは、隠しカラム oid を
持っており、その oid の値は INSERT 文では制御できないことです。
大抵は列挙値の末尾に追加されると思いますが、oidを大量に
消費しているようだと、a,b,c,d の並び順は予想できません。
# それ以外は、なんとなく動いてしまう気はします。

ちなみに、9.1 だと oid とは独立してソート順を決められるよう
enumsortorder 列が追加されています。

9.0以前のバージョンでの「正当な方法」は、↓のような感じでしょうか。
テーブルの再作成が発生するのが難点ですが、仕方ないところです。

-- 古い enum型の名前を変更する。
ALTER TYPE e RENAME TO e_old;
-- 新しい enum型を作成する。
CREATE TYPE e AS ENUM ('a', 'b', 'c', 'd');
-- 古い enum型を使っている列の型を変更。
ALTER TABLE tbl ALTER COLUMN col TYPE e USING (col::text::e);
-- 古い enum型を削除する。
DROP TYPE e_old;

9.1 でもenum値の「削除」はできないので、
この方法が必要なケースもあるかもしれません。

-- 
Itagaki Takahiro


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