os: centos 7.4
db: postgresql 10.11

oid、tableoid、ctid、xmin、xmax、cmin、cmax 这些都是 postgresql 数据库表的隐藏列.

起着不同的作用.

版本

# cat /etc/centos-release
CentOS Linux release 7.4.1708 (Core)
#
#
# yum list installed |grep -i postgresql
postgresql10.x86_64                10.11-2PGDG.rhel7                   @pgdg10
postgresql10-contrib.x86_64        10.11-2PGDG.rhel7                   @pgdg10
postgresql10-debuginfo.x86_64      10.11-2PGDG.rhel7                   @pgdg10
postgresql10-devel.x86_64          10.11-2PGDG.rhel7                   @pgdg10
postgresql10-docs.x86_64           10.11-2PGDG.rhel7                   @pgdg10
postgresql10-libs.x86_64           10.11-2PGDG.rhel7                   @pgdg10
postgresql10-odbc.x86_64           12.00.0000-1PGDG.rhel7              @pgdg10
postgresql10-plperl.x86_64         10.11-2PGDG.rhel7                   @pgdg10
postgresql10-plpython.x86_64       10.11-2PGDG.rhel7                   @pgdg10
postgresql10-pltcl.x86_64          10.11-2PGDG.rhel7                   @pgdg10
postgresql10-server.x86_64         10.11-2PGDG.rhel7                   @pgdg10
postgresql10-tcl.x86_64            2.4.0-1.rhel7                       @pgdg10
postgresql10-tcl-debuginfo.x86_64  2.3.1-1.rhel7                       @pgdg10
postgresql10-test.x86_64           10.11-2PGDG.rhel7                   @pgdg10 # su - postgres
Last login: Wed Jan 15 18:34:12 CST 2020 on pts/0
$
$
$ psql -c "select version();"version
----------------------------------------------------------------------------------------------------------PostgreSQL 10.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-39), 64-bit
(1 row)

oid、tableoid、ctid

oid 为内部行对象标识符,强烈不建议(或者禁止)用户表使用oid。用户默认建表时 with oids=false
tableoid 行归属的表的oid,通常在有继承关系的父表时,可以快速判断行数据所属的子表。
ctid 标记行的物理位置,格式为 (m,n) 其中 m表示块号,n表示在块内的行号

xmin、xmax、cmin、cmax

多版本实现中控制数据行的可见性

插入行时:xmin 置为当前事务ID,xmax 置为 0
删除行时:xmax 置为当前事务ID
更新行时:旧行上的 xmin 保持不变,旧行上的 xmax 置为当前事务ID
新行上的 xmin 置为当前事务ID,新行上的 xmax 置为 0

cmin、cmax 主要是用于判断同一个事务内的不同命令导致的行版本变化是否可见。这个理解透彻后再补充下

create table 试一下

# su - postgres
$ psqlpostgres=# create table tmp_t0 (id bigint primary key,name varchar(100)
);postgres=# select oid,relname from pg_class where relname='tmp_t0';oid   | relname
--------+---------379767 | tmp_t0
(1 row)postgres=# select attrelid,attname,attnum from pg_attribute where attrelid=379767;attrelid | attname  | attnum
----------+----------+--------379767 | tableoid |     -7379767 | cmax     |     -6379767 | xmax     |     -5379767 | cmin     |     -4379767 | xmin     |     -3379767 | ctid     |     -1379767 | id       |      1379767 | name     |      2
(8 rows)
postgres=# insert into tmp_t0 select 1,'a' ;postgres=# select * from tmp_t0;id | name
----+------1 | a
(1 row)postgres=# select tableoid,cmax,xmax,cmin,xmin,ctid,id,name from tmp_t0;tableoid | cmax | xmax | cmin |  xmin  | ctid  | id | name
----------+------+------+------+--------+-------+----+------379767 |    0 |    0 |    0 | 699844 | (0,1) |  1 | a
(1 row)

执行 update

postgres=# begin;postgres=# update tmp_t0 set name='b' where id=1;postgres=# select tableoid,cmax,xmax,cmin,xmin,ctid,id,name from tmp_t0;tableoid | cmax | xmax | cmin |  xmin  | ctid  | id | name
----------+------+------+------+--------+-------+----+------379767 |    0 |    0 |    0 | 699845 | (0,2) |  1 | b
(1 row)

可以看到新数据的 xmin=699845 ctid=(0,2)

另外一个会话查询数据

postgres=# select tableoid,cmax,xmax,cmin,xmin,ctid,id,name from tmp_t0;tableoid | cmax |  xmax  | cmin |  xmin  | ctid  | id | name
----------+------+--------+------+--------+-------+----+------379767 |    0 | 699845 |    0 | 699844 | (0,1) |  1 | a
(1 row)

符合预期

参考:

postgresql 数据库表隐藏列 oid、tableoid、ctid、xmin、xmax、cmin、cmax相关推荐

  1. PostgreSQL 中的系统字段:tableoid、xmin、xmax、cmin、cmax、ctid

    文章目录 tableoid ctid xmin xmax cmin cmax oid 总结 大家好!我是只谈技术不剪发的 Tony 老师.今天我们来谈谈 PostgreSQL 数据表中几个隐藏的系统字 ...

  2. 数据库表和列的别名的用法

    数据库表和列的别名的用法 使用数据库别名可以让sql语句的可读性更强 1.怎么给数据库表和某列(字段)起别名 用as就可以 列的别名:sql = "select 列名 as 别名 from ...

  3. 一键导出PostgreSQL数据库表设计为word文档

    背景 项目开始时,数据库表设计是从概要设计到详细设计,再到数据库中的表结构,有一套完整的文档: 然而,随着项目的演进,需求的变更,导致数据库表结构发生了比较大的变化(加表,加字段,改类型等),对于大多 ...

  4. pandas转mysql特定列_在pandas.DataFrame.to_sql时指定数据库表的列类型

    问题 在数据分析并存储到数据库时,Python的Pandas包提供了to_sql 方法使存储的过程更为便捷,但如果在使用to_sql方法前不在数据库建好相对应的表,to_sql则会默认为你创建一个新表 ...

  5. Sql Server 数据库 表增加列字段

    在工作中有可能因为需要对数据库增加一列字段,DDL 语句 ALTER TABLE 表名 ADD 字段名 字段的类型名称(长度) ALTER TABLE TUser ADD shortName VARC ...

  6. db2数据库表修改列为主键

    需要对一个已经有数据的表的列进行修改,列原属性是可以为空且有一个默认值,现在想修改为主键. 原来的ddl:column varchar(16) DEFAULT '0' 执行以下操作:(将列设为非空) ...

  7. mysql数据库表添加列的语句(例子)

    ALTER TABLE `t_order` ADD COLUMN `reimburse_num`  varchar(50) NULL COMMENT '报销单号' AFTER `corp_name`, ...

  8. 在 Kubernetes 上快速测试 Citus 分布式 PostgreSQL 集群(分布式表,共置,引用表,列存储)...

    准备工作 这里假设,你已经在 k8s 上部署好了基于 Citus 扩展的分布式 PostgreSQL 集群. 查看 Citus 集群(kubectl get po -n citus),1 个 Coor ...

  9. postgresql表和列注释(描述)

    2019独角兽企业重金招聘Python工程师标准>>> PostgreSQL添加表和列注释.本文为测试表test,默认无注释. test=# \d+关联列表架构模式 | 名称 | 类 ...

最新文章

  1. java 设置宽度和高度,如何通过设置高度和宽度来使宽度和高度反映ScaleTransform以及如何进行ScaleTransform?...
  2. Unicode编码完全探究(三)之联通乱码
  3. 将SmartForms转换为PDF保存到本地
  4. MySQL高级 - 查询缓存 - 配置参数
  5. 轻量级网络之mobilenet_v1
  6. 川农计算机网络题库,川农网院20秋《计算机网络》期末机考
  7. (转)使用Entity Framework和WCF Ria Services开发SilverLight之1:简单模型
  8. dao-service-servlet-jsp构建简易web通讯录(三层开发)软件安装
  9. QR码与DM码的对比
  10. ie8兼容性视图灰色修复_【ie8兼容性视图灰色修复】ie8兼容性视图 灰色_ie8兼容性视图设置...
  11. Mac怎么看剩余空间,Mac怎么看硬盘空间
  12. 考研高数 专题7:方程根的存在性及个数(零点定理-罗尔定理;单调性-罗尔定理推论)
  13. 0-glusterfs: failed to set volfile server: File exists
  14. Canvas实例之鼠标移动特效(彩色小球)
  15. 【uni-app】uni-app 封装 uni.request 携带请求头
  16. ACPC2015 K 树的直径
  17. Java学习(二)---SE阶段回顾
  18. 主要的数据仓库开发软件及软件功能比较
  19. 标签体系应用及设计思路
  20. 安卓局域网外实现木马监听

热门文章

  1. VB.net写的音乐播放器,带百度翻译歌词
  2. 游戏行业如何上云?阿里云架构师解读四大主流游戏架构
  3. odbc An unsupported operation was attempted
  4. 触摸DevOps,从现在开始DevOps之旅
  5. 鸿蒙os价格表,第一款搭载鸿蒙OS产品:配置价格都超美
  6. 售前工程师的成长---一个老员工的经验之谈(二)(转载)
  7. 【简约而不简单:神级代码的小秘密】| 第二章 栈
  8. arcgis新建图层信息复制_ArcGIS中的数据库之间复制和粘贴数据
  9. mybatis中的事务------我的笔记M11
  10. 零基础学kubernetes(k8s)必看教程,带你10分钟快速实战入门k8s