くれすのFreeBSD日記 このページをアンテナに追加 RSSフィード

只今建設中。。。

CressUnix.org

2008年07月19日(土)バージョン違いではまる

[] お褒めに預かりまして 16:18  お褒めに預かりまして - くれすのFreeBSD日記 を含むブックマーク はてなブックマーク -  お褒めに預かりまして - くれすのFreeBSD日記

ろんびぃさんのツイート: "高度に発達したくれすきゅんのブログはぱっと見新條まゆのブログと見分けがつかない [twn]"

高度に発達したくれすきゅんブログはぱっと見新條まゆブログと見分けがつかない

ということでこちらのデザインも変えてやった。今は反省している。


・・・・・・


ここは(たぶん)FreeBSD日記です。

[] TEXT型をINTEGER型に変更する 16:12  TEXT型をINTEGER型に変更する - くれすのFreeBSD日記 を含むブックマーク はてなブックマーク -  TEXT型をINTEGER型に変更する - くれすのFreeBSD日記

PostgreSQLは7系と8系だと、型の扱い方がちょっと違う。7系の方が縛りが緩く、明示的にキャストしたりしなくても関数が動いてしまったり、空文字なのにINTEGER型のカラムに書き込めたりしてしまう。

なので、7系での動作を想定していたプログラムを8系に移行したりすると動かなくなってしまうことがよくある。


ということで、TEXT型のカラムをINTEGER型に変換する方法。条件は以下の通り。

BEGIN;
UPDATE cress_demo SET item_type = NULL WHERE item_type = '';
ALTER TABLE cress_demo ALTER COLUMN item_type TYPE INTEGER USING ( item_type::INTEGER );
COMMIT;

厄介なのは空文字。NULL値ならそのまま整数型のカラムで使えるが、空文字だとキャストすることが出来ない。ここは一括UPDATEしてやればOKだが、レコード数が非常に多い場合は時間かかるかも。NOT NULL制約があったら・・・とりあえず0でも入れとけ。

ということで簡単でした。

*1:ALTER TABLE ... TYPE ... が使えないバージョンってあったっけ?7系で未実装だったのは確認済み。

トラックバック - http://freebsd.g.hatena.ne.jp/Cress/20080719