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