PostgreSQL 使用citd删除重复行

PostgreSQL 使用citd删除重复行,第1张

概述1. ctid的简单介绍:   ctid是PostgreSQL表中的系统字段,表示数据行在它所在表内的物理位置。ctid的字段类型是oid。但是VACUUM FULL *** 作之后,经过回收数据块内的空闲空间,数据行在块内的物理位置会发生移动,即ctid会发生变化。 2. 使用ctid删除重复行 数据 postgres=# select ctid,* from tb20; ctid | id -

1. ctID的简单介绍:
  ctID是Postgresql表中的系统字段,表示数据行在它所在表内的物理位置。ctID的字段类型是oID。但是VACUUM FulL *** 作之后,经过回收数据块内的空闲空间,数据行在块内的物理位置会发生移动,即ctID会发生变化。

2. 使用ctID删除重复行

数据

postgres=# select ctID,* from tb20;  ctID  | ID --------+---- (0,1)  | 1 (0,2)  | 1 (0,3)  | 1 (0,4)  | 1 (0,5)  | 2 (0,6)  | 2 (0,7)  | 2 (0,8)  | 3 (0,9)  | 3 (0,10) | 4(10 rows
简单方式
postgres=# delete from tb20 a where ctID<>(select min(ctID) from tb20 b where a.ID=b.ID);DELETE 6 postgres=# select ctID,* from tb20;  ctID  | ID --------+---- (0,1)  |  1 (0,5)  |  2 (0,8)  |  3 (0,10) |  4(4 rows)
稍复杂的方式
postgres=# select ctID,row_number() over(partition by ID) from tb20 ;  ctID  | row_number --------+------------ (0,1)  |          1 (0,2)  |          2 (0,3)  |          3 (0,4)  |          4 (0,5)  |          1 (0,6)  |          2 (0,7)  |          3 (0,8)  |          1 (0,9)  |          2 (0,10) |          1(10 rows)postgres=# select * from(select ctID,row_number() over(partition by ID) from tb20)sn where sn.row_number>1 ; ctID  | row_number -------+------------ (0,2) |          2 (0,3) |          3 (0,4) |          4 (0,6) |          2 (0,7) |          3 (0,9) |          2(6 rows)postgres=# delete from tb20 where ctID =any(array((select ctID from(select ctID,row_number() over(partition by ID) from tb20)sn where sn.row_number>1))) ;DELETE 6 postgres=# select ctID,10) |          1(4 rows)

  第一种方法在表tb20记录比较多的情况下,效率比较差,第二种方法更高效。

总结

以上是内存溢出为你收集整理的PostgreSQL 使用citd删除重复行全部内容,希望文章能够帮你解决PostgreSQL 使用citd删除重复行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1175815.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存