[pgsql-jp: 39258] Re: oidを使いたくなった場合

ITAGAKI Takahiro itagaki.takahiro @ oss.ntt.co.jp
2008年 2月 26日 (火) 10:11:15 JST


板垣です。

> Masafumi Horimoto さんは書きました:
> > 本当はダメダメなのかもしれませんが、同一のレコードがいくつかあって、
> > 一つだけ残して後を消したい場合にoidを使って一番若い番号以外を消す。
> > 
> > 何かよい方法はないものでしょうか?
> > 1) oidを使えるようにする。

単に oid の代わりになる ID を割り付けるだけならば、DDL 1行です。
やはり oid は周回が怖いので、こちらのほうがお勧めですね。
  ALTER TABLE test ADD COLUMN id SERIAL;

> > 2) oidを使わなくても重複のレコードを1個だけ残す。

重複削除の SQL を書く場合、ctid が使えます。これは、行の物理位置を表します。
以下は、id をユニークの条件として、ctid が最大のもの以外を削除します。
  DELETE FROM test
   USING (SELECT id, max(ctid) AS ctid FROM test GROUP BY id) AS X
   WHERE X.id = test.id AND X.ctid <> test.ctid;

Hisakazu Nakai <nakai @ shinko.co.jp> wrote:
> 無保証の方法ですが、order by の指定無しに select すると、
> 古い方から新しい方へと順番に表示されることが多いです。
> 一番最近に「更新」あるいは「追加」した行が最後に表示されるようです。
> その性質を使って不要な行を削除してはいかがでしょうか。

バージョン 8.3 からは、順序が安定しなくなりました。
以前と同様に ctid 順に取得したい場合には、
  SET synchronize_seqscans = off
をお忘れなく。

------------------------------------------------------------
板垣貴裕 <itagaki.takahiro @ oss.ntt.co.jp>





pgsql-jp メーリングリストの案内