postgresql重复数据的删除

本文介绍了使用CTID和MIN/MAX CTID方法在PostgreSQL中去除表中的重复数据,并展示了如何利用已有的唯一序列主键值进行优化。
今天在协助开发导表数据时发现有重复的数据,需要去重。去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。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直接删除。

转载于:https://my.oschina.net/Kenyon/blog/64017

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值