Home > pgsql > テーブル定義の変更と依存関係(その2)

テーブル定義の変更と依存関係(その2)

テーブル定義を変更したい場合、例えばフィールドの追加なんかだと、ALTER TABLE ... ADD ...; と追加すればいいわけだけど、それだと最後に追加することしかできない。"んーなもん常識だろ"といわれそうだけど、そういう保守的なのはイヤなんだ。

だとすればどうするか。

  1. まず、tbl1の依存関係を調べて、依存しているものをダンプしておく。大抵、プライマリキー制約とか外部参照制約とかだろう。但し制約だけをpg_dumpすることはできないので、pg_dump --schema-only --table=[テーブル名]で、テーブルごとダンプして必要な部分だけ切り出す必要がある。
  2. pg_dump --data-only --column-inserts --table=tbl1 する。--column-insertsを指定すると、insert into tbl1 (fld1, fld2...) values (.., ..);ってな形式でダンプされるわけだ。
  3. drop table tbl1 cascadeする。
  4. 新しいテーブル定義でcreate table tbl1...する。
  5. 1.でpg_dumpした依存しているオブジェクトを戻す。
  6. 2.でpg_dumpしたデータを流しこむ

ってな感じだ。フィールドの削除があった場合はそのままpg_dump --data-onlyすると流し込む時にエラーになるので、先にCREATE TEMP TABLE t AS SELECT fld1, ...;等と一時テーブルを作っておいてそれをpg_dumpするといいだろう。この辺を自動化するツールがあったら素敵だと思う。

っーか、色々考えてたら、pg_dumpを書き直したくなってきちゃったなぁ。

Writeback:0

Comment Form

writeback message: Ready to post a comment.

TrackBack ping me at
http://www.mono-space.net/blog/pgsql/040408depend.trackback

Page Top