2008年2月26日

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

板垣です。

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

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

------------------------------------------------------------
板垣貴裕 <itagaki.takahiro@xxxxx>


投稿者 xml-rpc : 2008年2月26日 10:33
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/70357
トラックバック
[メモ]PostgreSQLのctid
概要 MLog: [pgsql-jp: 39258] Re:oidを使いたくなった場合 重複削除の SQL を書く場合、ctid が使えます。これは、行の物理...
ウェブログ: いいタイトルが浮かびません。 時刻: 2008年2月29日 10:06
コメント
コメントする




画像の中に見える文字を入力してください。