- 2004-10-24
- pgsql
テーブル定義を変更したい場合、例えばフィールドの追加なんかだと、ALTER TABLE ... ADD ...; と追加すればいいわけだけど、それだと最後に追加することしかできない。"んーなもん常識だろ"といわれそうだけど、そういう保守的なのはイヤなんだ。
だとすればどうするか。
- まず、tbl1の依存関係を調べて、依存しているものをダンプしておく。大抵、プライマリキー制約とか外部参照制約とかだろう。但し制約だけをpg_dumpすることはできないので、pg_dump --schema-only --table=[テーブル名]で、テーブルごとダンプして必要な部分だけ切り出す必要がある。
- pg_dump --data-only --column-inserts --table=tbl1 する。--column-insertsを指定すると、insert into tbl1 (fld1, fld2...) values (.., ..);ってな形式でダンプされるわけだ。
- drop table tbl1 cascadeする。
- 新しいテーブル定義でcreate table tbl1...する。
- 1.でpg_dumpした依存しているオブジェクトを戻す。
- 2.でpg_dumpしたデータを流しこむ
ってな感じだ。フィールドの削除があった場合はそのままpg_dump --data-onlyすると流し込む時にエラーになるので、先にCREATE TEMP TABLE t AS SELECT fld1, ...;等と一時テーブルを作っておいてそれをpg_dumpするといいだろう。この辺を自動化するツールがあったら素敵だと思う。
っーか、色々考えてたら、pg_dumpを書き直したくなってきちゃったなぁ。