在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 | oid
cmax | -5 | cid
xmax | -4 | xid
cmin | -3 | cid
xmin | -2 | xid
ctid | -1 | tid
col | 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 | 1
51137 | 2
51137 | 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 1 test=# select tableoid::regclass,a from t_list;
tableoid | a
-----------+---
t_list_p1 | 1
t_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:47
5 | 2023-01-06 11:24:47
6 | 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 | 2
0 | 3
0 | 1
(3 行记录)
test=# delete from test where col =3;
DELETE 1 在事务未提交的情况下,在开一个新会话进行查询:
session 2
test=# select xmax,col from test;
xmax | col
-------+-----
0 | 2
42292 | 3
42292 | 4
(3 行记录) KingbaseES的update操作是一个先delete后insert的过程,所以在事务未提交的情况下,session 2能看到记录4被42292事务删除的信息。
session 1事务提交后,session 2 查询结果:
test=# select xmax,col from test;
xmax | col
------+-----
0 | 2
0 | 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 | 42290
0 | 0 | 1 | 42292
0 | 0 | 3 | 42293
1 | 1 | 4 | 42293
2 | 2 | 5 | 42293
0 | 0 | 6 | 42294

KingbaseES 表中隐藏字段说明的更多相关文章

  1. 【HANA系列】SAP HANA SLT 在表中隐藏字段并传入HANA的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...

  2. 【HANA系列】SAP HANA SLT在表中隐藏字段并传入HANA的方法

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA SLT在表中隐 ...

  3. mysql向表中某字段后追加一段字符串:

    mysql向表中某字段后追加一段字符串:update table_name set field=CONCAT(field,'',str) mysql 向表中某字段前加字符串update table_n ...

  4. 解决SQL server 2014 修改表中的字段,无法保存的问题。

    修改PROJECT表中的字段,保存时,弹出上面的窗体,无法保存. 解决方法为:[工具]->[选项]->[设计器]中,去掉“阻止保存要求重新创建表的更改”前的勾选.

  5. mongoDB删除表中一个字段

    使用update命令 update命令 update命令格式: db.collection.update(criteria,objNew,upsert,multi) 参数说明: criteria:查询 ...

  6. c++获取sqlite3数据库表中所有字段的方法

    常用方法: 1.使用sqlite3_get_table函数 2.获取sqlite创建表的sql语句字符串,然后进行解析获取到相应的字段 3.采用配置文件的方式,将所有字段名写入配置文件 方法1:使用s ...

  7. syscolumns表中所有字段的意思

    --syscolumns表中所有字段的意思 name sysname --列名或过程参数的名称. id int --该列所属的表对象 ID,或与该参数关联的存储过程 ID. xtype tinyint ...

  8. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  9. 在oracle表中增加字段,并调整字段的顺序

    增加字段的语句很简单,以用户身份连接oracle服务: alter table tablename add(colname coltype); # 填上表名.字段名.字段类型 修改字段顺序前,查看表中 ...

  10. SQL Server 复制表结构以及数据,去除表中重复字段

    --复制另一个数据库中的某张表的结构及数据--select * from Test.dbo.TestTable(查询表中所有数据) --into [表名] 插入当前数据库新表,如果没有该表就创建 se ...

随机推荐

  1. 【Unity3D】固定管线着色器二

    1 前言 ​ 固定管线着色器一 中介绍了 Shader 中外部属性.光照.贴图等基础用法,本文将进一步讲解固定管线着色器,介绍正面与反面剔除.Alpha 测试.深度测试.混合.渲染队列等用法.渲染管线 ...

  2. Error parsing HTTP request header--400 bad request

    问题描述: JSP中通过form post方式请求URL传入json格式参数报错: 信息: Error parsing HTTP request header  Note: further occur ...

  3. C++ 线程的学习---线程死锁

      因为是学习篇,写下是为了个人的学习与理解.故参考其他文章为多. 为什么会有死锁?           想象一下这样的情况,thread A 在run的时候需要等待thread B的结果,也就是th ...

  4. MySQL Boolean类型的坑

    MySQL中,Boolean只是 tinyint(1) 的别名,也就是说,MySQL中并没有真正的bool类型. 而SQLAlchemy生成SQL的时候并没有检测到 这一点,这就导致一个问题,当使用 ...

  5. 基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离、强大、跨平台的快速开发框架

    前言 今天大姚给大家推荐一款基于Vue(提供Vue2/Vue3版本)和.Net Core前后端分离.开源免费(MIT License).强大.跨平台的快速开发框架,并且框架内置代码生成器(解决重复性工 ...

  6. vue使用cordova的大坑!!

    额,前段时间用 cordova 包了个 vue 项目,跑真机,完美.跑公司安卓系统虚拟机,垮. 原因找了很久,最后发现是路由的问题,使用了 createWebHistory ,去掉了 hash ,虽然 ...

  7. gitee的 私人令牌 就是 Gitee Open API 的 access_token

    gitee的 私人令牌 就是 Gitee Open API 的 access_token

  8. Sub-process /usr/bin/dpkg returned an error code (1)问题

    在用apt-get安装软件包的时候遇到E: Sub-process /usr/bin/dpkg returned an error code (1)问题,解决方法如下: cd /var/lib/dpk ...

  9. TLSR8258方案开发之BLE协议接口代码解析

    一 前言 这里的代码是在原厂基础上修改了不少.虽然代码复杂了不少,但是逻辑也清晰了不少. 二  广播协议 想要熟悉并修改ble的广播协议和内容,请查阅结构体: static const attribu ...

  10. CMake 用法总结(转载)

    原文地址 什么是 CMake All problems in computer science can be solved by another level of indirection. David ...