在KingbaseES中,当我们创建一个数据表时,数据库会隐式增加几个系统字段。这些字段由系统进行维护,用户一般不会感知它们的存在。
例如,以下语句创建了一个简单的表:

create table test(col number);
insert into test(col) values (1),(2),(3);

从定义上来看,表 test 中只有一个字段;但是当我们查询数据字典表 sys_attribute 时,结果却不是如此:

test=# \d test数据表 "public.test"栏位 |  类型   | 校对规则 | 可空的 | 预设
------+---------+----------+--------+------col  | numeric test=# select attname, attnum, atttypid::regtype from sys_attribute where attrelid = 'test'::regclass;attname  | attnum | atttypid
----------+--------+----------tableoid |     -6 | oidcmax     |     -5 | cidxmax     |     -4 | xidcmin     |     -3 | cidxmin     |     -2 | xidctid     |     -1 | tidcol      |      1 | numeric
(7 行记录)

查询结果显示,表test一共包含7个字段。KingbaseES为我们增加了6个额外的系统字段,它们的attnum属性都是负数。
下面让我们分别看看这些系统字段的作用。

tableoid
tableoid 字段代表了数据所在表的对象 id(OID),也就是数据字典表 sys_class 中与该表信息相关的数据行。

test=# select oid, relname from sys_class where relname = 'test';oid  | relname
-------+---------51137 | test
(1 行记录)test=# select tableoid, col from test ;                                                                                                                                     tableoid | col
----------+-----51137 |   151137 |   251137 |   3
(3 行记录)

tableoid 的另一个用途就是在涉及分区表查询或者UNION操作时标识数据行所在的具体表(分区)。例如存在以下分区表:

test=# create table t_list(a int,b int)
test-# partition by list(a)
test-# (
test(#   partition p1 values (1,2,3,4,5),
test(#   partition p2 values (6,7,8,9,10)
test(# );
CREATE TABLE
test=# insert into t_list values(1,1);
INSERT 0 1
test=# insert into t_list values(7,1);
INSERT 0 1test=# select tableoid::regclass,a from t_list;tableoid  | a
-----------+---t_list_p1 | 1t_list_p2 | 7
(2 行记录)

ctid
ctid 字段代表了数据行在表中的物理位置,也就是行标识(tuple identifier),由一对数值组成(块编号和行索引)。ctid 类似于 Oracle 中的伪列 ROWID。
需要注意的是,ctid的值有可能会改变(例如 VACUUM FULL);因此ctid不适合作为一个长期的行标识,应该使用主键作为行的逻辑标识。

test=# select ctid ,col from test;ctid  | col
-------+-----(0,1) |   1(0,2) |   2(0,3) |   3
(3 行记录)test=# delete from test where col = 1;
DELETE 1
test=# select ctid ,col from test;    ctid  | col
-------+-----(0,2) |   2(0,3) |   3
(2 行记录)test=# vacuum full test;
VACUUM
test=# select ctid ,col from test;ctid  | col
-------+-----(0,1) |   2(0,2) |   3
(2 行记录)

xmin
xmin代表了该行版本(row version)的插入事务ID(XID)。行版本是数据行的具体状态,每次更新操作都会为相同的逻辑行创建一个新的行版本(多版本并发控制,MVCC)。
xmin 字段可以用于查看数据行的插入时间,需要事先打开track_commit_timestamp参数(前两行插入时参数未设置所以没有查询到时间)。

test=# insert into test(col) values (4),(5),(6);
INSERT 0 3
test=# select col,to_char(sys_xact_commit_timestamp(xmin) ,'YYYY-MM-DD HH24:MI:SS') AS insert_time from test;col |     insert_time
-----+---------------------2 | 3 | 4 | 2023-01-06 11:24:475 | 2023-01-06 11:24:476 | 2023-01-06 11:24:47
(5 行记录)

xmax
xmax 字段代表了删除该行的事务 ID,对于未删除的行版本显示为 0。非零的 xmax 通常意味着删除事务还没有提交,或者删除操作被回滚。

session 1:
test=# begin;
BEGIN
test=# update test set col=1 where col =4;
UPDATE 1
test=# select xmax,col from test;xmax | col
------+-----0 |   20 |   30 |   1
(3 行记录)
test=# delete from test where col =3;
DELETE 1在事务未提交的情况下,在开一个新会话进行查询:
session 2
test=# select xmax,col from test;xmax  | col
-------+-----0 |   242292 |   342292 |   4
(3 行记录)KingbaseES的update操作是一个先delete后insert的过程,所以在事务未提交的情况下,session 2能看到记录4被42292事务删除的信息。
session 1事务提交后,session 2 查询结果:
test=# select xmax,col from test;xmax | col
------+-----0 |   20 |   1
(2 行记录)

cmin/cmax
代表元组变更的命令在插入事务中的命令标识(从0开始累加)。

test=# begin;
BEGIN
test=# insert into test values (3);
INSERT 0 1
test=# insert into test values (4);
INSERT 0 1
test=# insert into test values (5);
INSERT 0 1
test=# commit;
COMMIT
test=# insert into test values (6);
INSERT 0 1
test=# select cmin,cmax,col,xmin from test;     cmin | cmax | col | xmin
------+------+-----+-------0 |    0 |   2 | 422900 |    0 |   1 | 422920 |    0 |   3 | 422931 |    1 |   4 | 422932 |    2 |   5 | 422930 |    0 |   6 | 42294

KingbaseES 中的xmin,xmax等系统字段说明相关推荐

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

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

  2. Yigo平台中系统自带的五个系统字段值

    如图: 系统字段不允许编辑,不允许删除 一·OID是主表的对象标识,SOID用于定义其他表与主表之间的关系.如图所示: OID:对象标识,是一条数据的唯一标识 SOID:主对象标识,用来主表跟其他表进 ...

  3. ABAP 编程语言中的系统字段(System Fields)

    ABAP 系统字段,给应用开发人员提供了当前系统相关信息. BC400 教材上给出了部分例子: 下面我们写一些简单的 ABAP 代码,来熟悉系统字段的用法. 就一行语句:WRITE:/ sy-unam ...

  4. ABAP语言常用的系统字段及函数

    ABAP语言常用的系统字段及函数 常用的系统变量如下: 1.SY-PAGNO当前页号 2.SY-DATUM当前时间 3.SY-LINSZ当前报表宽度 4.SY-LINCT当前报表长度 5.SPACE空 ...

  5. 获取sqlserver数据库中所有库、表、字段名的方法

    获取sqlserver数据库中所有库.表.字段名的方法 2009年03月12日 星期四 下午 12:51 1.获取所有数据库名: SELECT Name FROM Master..SysDatabas ...

  6. 粒子群课设_GitHub - LIYAJUN2018/tscss: 基于粒子群算法的中职自动排课系统

    kvf-admin kvf-admin是一套快速开发框架.脚手架.后台管理系统.权限系统,上手简单,拿来即用.为广大开发者去除大部分重复繁锁的代码工作,让开发者拥有更多的时间陪恋人.家人和朋友. 后端 ...

  7. ArcGIS计算图斑的四邻坐标(XMin,XMax,YMin,YMax)

    1.背景: 在国土,调查等行业业务里面经常有需要计算某个图斑的四邻坐标,即xmax,xmin,ymin,ymax;也就是常说的MBR(最小外包矩形),本教程演示如何计算一个shapefile文件上的图 ...

  8. [转]ArcGIS计算图斑的四邻坐标(XMin,XMax,YMin,YMax)

    1.背景: 在国土,调查等行业业务里面经常有需要计算某个图斑的四邻坐标,即xmax,xmin,ymin,ymax;也就是常说的MBR(最小外包矩形),本教程演示如何计算一个shapefile文件上的图 ...

  9. oracle中设置表的主键字段为自增序列(实例)

    oracle中设置表的主键字段为自增序列(实例) 1.首先创建一个表(如日志表) //删除库表中存在的日志表 drop table S_LOG_INFO cascade constraints; // ...

最新文章

  1. Spring @SessionAttributes @ModelAttribute
  2. Spring Boot 2.x基础教程:Swagger静态API文档的生成
  3. ae输出quicktime设置_AE大神再现酷炫神技能,AE中怎么输出带透明通道的视频文件!...
  4. 为什么在国外刷信用卡只用签名,而国内却需要输入密码?
  5. 在线登记系统代码 php_PHP框架实现WebSocket在线聊天通讯系统
  6. 任正非:华为鸿蒙将比安卓快 60%;小米回应主题侵权;VS Code 1.36发布​ | 极客头条...
  7. “数”有专攻、智“汇”武汉,周末技术沙龙Call你来!
  8. 资源描述框架RDF-阮一峰
  9. Mysql type字段值1改为2,2改为1
  10. mysql免安装 配置_MySql免安装版配置方法
  11. 分享三种计算机专业毕业设计模板附下载地址
  12. 页面置换算法java_页面置换算法之Clock算法
  13. 联想笔记本电脑E570永久禁用触摸板
  14. 带左右箭头的图片轮播
  15. eclipse发生了错误,请参阅日志文件怎么办呀
  16. Linux下软连接的概念
  17. 现代服务器底层奠基(SEDA+Reactor/Proactor+epoll/kqueue )
  18. 堆垛实训报告总结_叉车实训总结
  19. 云崽部署问题解决贴:关于Yunzai-Bot部署后可能遇到的QQ版本过低问题||和一个puppeteer Chromium启动失效问题
  20. Javascript中Window.open参数详解

热门文章

  1. github android 开源,Android github开源项目学习之—仿知乎APP(一)
  2. 〖Python零基础入门篇㉟〗- 私有函数、私有变量及封装
  3. 3000字作文 小孩调皮
  4. 剪映导出帧率选多少_剪映帧率是什么 剪映帧率在哪设置
  5. Linux文件系统管理-常用命令df\du\fsck\dumpe2fs
  6. Django+itchat+apscheduler实现向指定微信群和微信好友定时发送信息和文件
  7. visual studio mfc 界面 布局调整
  8. 机器学习和深度学习的区别
  9. 善于计划,善于总结,善于归纳
  10. 挖掘服务器ads怎么修改密码,数据管理服务器ADSADX.PDF