PostgreSQL 使用citd删除重复行
来源:互联网 发布:网络印刷平台的趋势 编辑:程序博客网 时间:2024/06/07 00:50
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 6postgres=# 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 6postgres=# select ctid,row_number() over(partition by id) from tb20 ; ctid | row_number --------+------------ (0,1) | 1 (0,5) | 1 (0,8) | 1 (0,10) | 1(4 rows)
第一种方法在表tb20记录比较多的情况下,效率比较差,第二种方法更高效。
0 0
- PostgreSQL 使用citd删除重复行
- PostgreSQL删除重复数据
- Postgresql删除重复数据
- postgresql 删除ID重复数据
- PostgreSQL中删除重复行(保留一行)
- 使用Emacs删除重复行
- 使用ROWID查找和删除重复行
- 使用ROWID查找和删除重复行
- 使用Editplus删除文本文件中的重复行
- 使用UltraEdit删除重复的行
- 使用UltraEdit删除重复的行
- postgresql数据库三种删除重复数据的方法
- postgresql删除重复记录的一些相关sql语句
- 使用ROW_NUMBER 删除重复数据
- DISTINCT删除重复行
- 删除SQL重复行
- 删除重复行
- 删除重复的行
- 全球最顶级交易员回忆录
- string中c_str()、data()、copy(p,n)函数的用法
- 实现记录密码和用户名
- XML新手入门
- 函数指针的用法
- PostgreSQL 使用citd删除重复行
- 第八章实验2
- I2C-pcf8563
- 关于R语言里的调用类型(call)
- HDU 4585- Shaolin
- 锐浪报表“未能用指定连接串 "连接字段"连接到数据源,连接串中的用户名和密码已隐藏”
- iOS应用架构谈 网络层设计方案
- Timing Wheel 定时轮算法
- malloc、calloc、realloc的区别