2011年9月 4日

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

2011/9/4 武田 憲太郎 <takeda@xxxxx>:
> 要素の追加方法について、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

投稿者 xml-rpc : 2011年9月 4日 09:56
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/106057
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。