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

武田 憲太郎 takeda @ youmind.jp
2011年 9月 5日 (月) 11:53:13 JST


MauMau様 板垣様

早速のご回答ありがとうございます!
とりあえず今回は、お二方より頂いた回答を踏まえまして、

・9.1リリースまでの「つなぎ」として使用する。
・【※】あくまで自己責任で使用する。

という感じにします。
【※】の部分を認識できたのが大収穫です。ありがとうございます。
(要求事項としてではなく案件の進行上の止ん事無き理由でどうしても追加が…)


(MauMau様)
>手作業の結果として期待した動作が得られたとしても、
>それは将来も保証されるものではありません。

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

となると、9.0→9.1の以降で、既にいきなり同じ方法は使えなくなる、と。
ツールに組み込んだりとかはもう絶対にNGなわけですね。

-----Original Message-----
From: pgsql-jp-bounces @ ml.postgresql.jp [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Itagaki Takahiro
Sent: Sunday, September 04, 2011 9:56 AM
To: PostgreSQL Japanese Mailing List
Subject: [pgsql-jp: 40912] Re: enum型の追加変更削除について

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 メーリングリストの案内