postgresql中的ctid解读

 更新时间:2023年11月28日 09:54:50   作者:瀚高PG实验室 (Highgo PG Lab)  
这篇文章主要介绍了postgresql中的ctid使用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

postgresql中的ctid

ctid表示

数据行在它所处的表内的物理位置,ctid字段的类型是tid。

尽管ctid可以快速定位数据行,每次vacuum full之后,数据行在块内的物理位置就会移动,即ctid会发生变化,所以ctid不能作为长期的行标识符,应该使用主键来标识一个逻辑行。

查看ctid

示例如下:

mydb=# select ctid,id from t1 ;

 ctid  | id

-------+----

 (0,1) | 10

 (0,2) | 11

(2 rows)

由上可知,ctid由两个数字组成,第一个数字表示物理块号,第二个数字表示在物理块中的行号。tid类型可以使用字符串输入,如想查询表t1中0号物理块中第11行内容,

示例如下:

mydb=# select ctid,id from t1 where ctid='(0,11)';

  ctid  | id

--------+----

 (0,11) | 19

(1 row)

利用ctid可以删除一个表中的重复数据,

例如表t1有以下数据

mydb=# select id,count(*) from t1 group by id;

 id | count

----+-------

 34 |     2

 43 |     2

 25 |     2

 32 |     2

 12 |     1

  1 |     1

 10 |     1

 26 |     2

 42 |     2

 11 |     1

 18 |     1

 16 |     1

 39 |     2

 54 |     2

 47 |     2

 13 |     1

 49 |     2

 22 |     3

 24 |     2

 14 |     1

 45 |     2

 46 |     2

 27 |     2

 48 |     2

 55 |     2

 17 |     1

 28 |     2

 36 |     2

 15 |     1

 38 |     2

 30 |     2

 50 |     2

 33 |     2

 40 |     2

 56 |     2

 53 |     2

 19 |     1

 29 |     2

 21 |     1

 57 |     2

 51 |     2

 23 |     2

 41 |     2

 31 |     2

 35 |     2

 52 |     2

 20 |     1

 44 |     2

 37 |     2

(49 rows)

删除重复数据的SQL为:

mydb=# delete from t1 a where a.ctid <>(select min(b.ctid) from t1 b where a.id=b.id);

DELETE 37

mydb=# select id,count(*) from t1 group by id;

 id | count

----+-------

 34 |     1

 43 |     1

 25 |     1

 32 |     1

 12 |     1

  1 |     1

 10 |     1

 26 |     1

 42 |     1

 11 |     1

 18 |     1

 16 |     1

 39 |     1

 54 |     1

 47 |     1

 13 |     1

 49 |     1

 22 |     1

 24 |     1

 14 |     1

 45 |     1

 46 |     1

 27 |     1

 48 |     1

 55 |     1

 17 |     1

 28 |     1

 36 |     1

 15 |     1

 38 |     1

 30 |     1

 50 |     1

 33 |     1

 40 |     1

 56 |     1

 53 |     1

 19 |     1

 29 |     1

 21 |     1

 57 |     1

 51 |     1

 23 |     1

 41 |     1

 31 |     1

 35 |     1

 52 |     1

 20 |     1

 44 |     1

 37 |     1

(49 rows)

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • PostgreSql 导入导出sql文件格式的表数据实例

    PostgreSql 导入导出sql文件格式的表数据实例

    这篇文章主要介绍了PostgreSql 导入导出sql文件格式的表数据实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL13基于流复制搭建后备服务器的方法

    PostgreSQL13基于流复制搭建后备服务器的方法

    这篇文章主要介绍了PostgreSQL13基于流复制搭建后备服务器,后备服务器作为主服务器的数据备份,可以保障数据不丢,而且在主服务器发生故障后可以提升为主服务器继续提供服务。需要的朋友可以参考下
    2022-01-01
  • Postgresql 存储过程(plpgsql)两层for循环的操作

    Postgresql 存储过程(plpgsql)两层for循环的操作

    这篇文章主要介绍了Postgresql 存储过程(plpgsql)两层for循环的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL教程(六):函数和操作符详解(2)

    PostgreSQL教程(六):函数和操作符详解(2)

    这篇文章主要介绍了PostgreSQL教程(六):函数和操作符详解(2),本文讲解了模式匹配、数据类型格式化函数、时间/日期函数和操作符等内容,需要的朋友可以参考下
    2015-05-05
  • 解决postgresql 序列跳值的问题

    解决postgresql 序列跳值的问题

    这篇文章主要介绍了解决postgresql 序列跳值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL使用MySQL作为外部表(mysql_fdw)

    PostgreSQL使用MySQL作为外部表(mysql_fdw)

    PostgreSQL 提供了一种访问和操作外部数据源的机制,称为外部数据包装器,本文主要给大家介绍了PostgreSQL使用MySQL作为外部表的方法,感兴趣的朋友跟随小编一起看看吧
    2022-11-11
  • PostgreSQL数据库如何定期清理归档(pg_wal)日志

    PostgreSQL数据库如何定期清理归档(pg_wal)日志

    在⼀般的⽣产环境中,数据库都需要开启归档模式,下面这篇文章主要给大家介绍了关于PostgreSQL数据库如何定期清理归档(pg_wal)日志的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-05-05
  • PostgreSQL关闭数据库服务的三种模式

    PostgreSQL关闭数据库服务的三种模式

    PostgreSQL 提供了三种关闭数据库服务的不同方式,它们最终都是发送一个关闭信号到 postgres 主服务进程,本文将给大家详细的介绍一下这三种模式,需要的朋友可以参考下
    2024-07-07
  • PostgreSQL向数据库表中添加行数据的操作

    PostgreSQL向数据库表中添加行数据的操作

    这篇文章主要介绍了PostgreSQL向数据库表中添加行数据的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL基础知识之SQL操作符实践指南

    PostgreSQL基础知识之SQL操作符实践指南

    这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-05-05

最新评论