postgresql重複データの削除

1839 ワード

今日、ガイドデータの開発に協力したところ、重複したデータが発見され、重くする必要があります.重量除去の方法は、一般に、重複データの1つを見つけ、ある一意の条件で他の重複値を除去することです.oracleでよく使われるのはrowidによるもので、PGにも唯一のフィールドctidがありますが、これによるものでも構いません.表にoidが設定されている場合、データ量が少ない場合でも構いません.もちろん、テーブルに一意のシーケンス値があると便利です.次はctidで重複データを削除するテストです.テストデータ
postgres=# create table test(id int,name varchar);
CREATE TABLE
postgres=# insert into test values (1,'kenyon');
INSERT 0 1
postgres=# insert into test values (1,'kenyon');
INSERT 0 1
postgres=# insert into test values (1,'kenyon');
INSERT 0 1
postgres=# insert into test values (2,'kenyon_test');
INSERT 0 1
postgres=# insert into test values (2,'kenyon_test');
INSERT 0 1
postgres=# insert into test values (3,'test');
INSERT 0 1
postgres=# insert into test values (5,'test');
INSERT 0 1
postgres=# insert into test values (5,'jackson');
INSERT 0 1

postgres=# select ctid,* from test;
 ctid  | id |    name     
-------+----+-------------
 (0,1) |  1 | kenyon
 (0,2) |  1 | kenyon
 (0,3) |  1 | kenyon
 (0,4) |  2 | kenyon_test
 (0,5) |  2 | kenyon_test
 (0,6) |  3 | test
 (0,7) |  5 | test
 (0,8) |  5 | jackson
(8 rows)
保留するデータを問合せ、min(ctid)またはmax(ctid)を基準とする
postgres=# select ctid,* from test where ctid in (select min(ctid) from test group by id);
 ctid  | id |    name     
-------+----+-------------
 (0,1) |  1 | kenyon
 (0,4) |  2 | kenyon_test
 (0,6) |  3 | test
 (0,7) |  5 | test
(4 rows)
重複データを削除し、最終結果を表示
postgres=# delete from test where ctid not in (select min(ctid) from test group by id);
DELETE 4
postgres=# select ctid,* from test;
 ctid  | id |    name     
-------+----+-------------
 (0,1) |  1 | kenyon
 (0,4) |  2 | kenyon_test
 (0,6) |  3 | test
 (0,7) |  5 | test
(4 rows)
表に一意のシーケンスプライマリ・キー値が明記されている場合は、上記のctidを置き換えて直接削除できます.