转自 https://www.2cto.com/database/201206/137301.html
和oracle
数据库一样,postgresql也有自身的一套隐藏的系统列。下面介绍如下:
1.oid
oid是object identifier的简写,其相关的参数设置default_with_oids设置一般默认是false,或者创建表时指定with (oids=false),其值长度32bit,实际的数据库系统应用中并不能完全保证其唯一性; www.2cto.com
2.tableoid
是表对象的一个唯一标识符,可以和pg_class中的oid联合起来查看
3.xmin 默认排序(最新的会在最下面)
是插入的事务标识符,是用来标识不同事务下的一个版本控制。每一次更新该行都会改变这个值。可以和m
vcc版本结合起来看
4.xmax
是删除更新的事务标识符,如果该值不为0,则说明该行数据当前还未提交或回滚。比如设置begin事务时可以明显看到该值的变化
5.cmin
插入事务的命令标识符,从0开始
6.cmax
删除事务的命令标识符,或者为0
7.ctid
是每行数据在表中的一个物理位置标识符,和oracle的rowid类似,但有一点不同,当表被vacuum full或该行值被update时该值可能会改变。所以定义表值的唯一性最好还是自己创建一个序列值的主键列来标识比较合适。不过使用该值去查询时速度还是非常快的。
下面举例说明:
postgres=# create table test(id int,name varchar);
CREATE TABLE
postgres=# insert into test select generate_series(1,3),repeat('kenyon',2);
INSERT 0 3
postgres=# select cmin,cmax,xmin,xmax,ctid from test;
cmin | cmax | xmin | xmax | ctid
--------+--------+------+--------+-------
0 | 0 | 1852 | 0 | (0,1)
0 | 0 | 1852 | 0 | (0,2)
0 | 0 | 1852 | 0 | (0,3)
(3 rows)
我们可以看到xmin值是一样的,表示是同一个事务
postgres=# begin;
BEGIN
postgres=# insert into test values (4,'a');
INSERT 0 1
postgres=# insert into test values (5,'aa');
INSERT 0 1
postgres=# insert into test values (6,'aa');
INSERT 0 1
postgres=# insert into test values (7,'aad');
INSERT 0 1
postgres=# commit;
COMMIT
postgres=# select cmin,cmax,xmin,xmax,ctid,* from test;
cmin | cmax | xmin | xmax | ctid | id | name
--------+--------+------+--------+-------+-----+--------------
0 | 0 | 1852 | 0 | (0,1) | 1 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,2) | 2 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,3) | 3 | kenyonkenyon
0 | 0 | 1853 | 0 | (0,4) | 4 | a
1 | 1 | 1853 | 0 | (0,5) | 5 | aa
2 | 2 | 1853 | 0 | (0,6) | 6 | aa
3 | 3 | 1853 | 0 | (0,7) | 7 | aad
这里我们可以看到cmin和cmax值有了变化
postgres=# begin;
BEGIN
postgres=# update test set name = 'keke' where id = 7;
UPDATE 1
postgres=# update test set name = 'kekeke' where id = 6;
UPDATE 1
postgres=# update test set name = 'kenyon_test' where id = 5;
UPDATE 1
在另外一个会话中我们去查看xmax值
postgres=# select cmin,cmax,xmin,xmax,ctid,* from test;
cmin | cmax | xmin | xmax | ctid | id | name
--------+--------+------+------+-------+-----+--------------
0 | 0 | 1852 | 0 | (0,1) | 1 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,2) | 2 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,3) | 3 | kenyonkenyon
0 | 0 | 1853 | 0 | (0,4) | 4 | a
2 | 2 | 1853 | 1854 | (0,5) | 5 | aa
1 | 1 | 1853 | 1854 | (0,6) | 6 | aa
0 | 0 | 1853 | 1854 | (0,7) | 7 | aad
(7 rows)
原会话中我们执行commit并查看
postgres=# commit;
COMMIT
postgres=# select cmin,cmax,xmin,xmax,ctid,* from test;
cmin | cmax | xmin | xmax | ctid | id | name
--------+--------+------+--------+---------+-----+--------------
0 | 0 | 1852 | 0 | (0,1) | 1 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,2) | 2 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,3) | 3 | kenyonkenyon
0 | 0 | 1853 | 0 | (0,4) | 4 | a
0 | 0 | 1854 | 0 | (0,8) | 7 | keke
1 | 1 | 1854 | 0 | (0,9) | 6 | kekeke
2 | 2 | 1854 | 0 | (0,10) | 5 | kenyon_test
(7 rows)
这时我们可以看到ctid也有了变化,在原来的基础上(0,7)往上累积,另外xmax因为事务被commit 的缘故也被置为0了。 再做下delete和insert的一个简单操作
postgres=# delete from test where id = 1;
DELETE 1
postgres=# insert into test values (8,'jackson');
INSERT 0 1
postgres=# select cmin,cmax,xmin,xmax,ctid,* from test;
cmin | cmax | xmin | xmax | ctid | id | name
--------+--------+------+--------+---------+-----+--------------
0 | 0 | 1852 | 0 | (0,2) | 2 | kenyonkenyon
0 | 0 | 1852 | 0 | (0,3) | 3 | kenyonkenyon
0 | 0 | 1853 | 0 | (0,4) | 4 | a
0 | 0 | 1854 | 0 | (0,8) | 7 | keke
1 | 1 | 1854 | 0 | (0,9) | 6 | kekeke
2 | 2 | 1854 | 0 | (0,10) | 5 | kenyon_test
0 | 0 | 1856 | 0 | (0,11) | 8 | jackson
这时我们可以看到其实delete的事务ID(xmin)值是1855,insert的(xmin)值是1856,ctid往上累计
最后看一下tableoid和pg_class中oid的关系,(oid不说了,系统中一般设置为false)
postgres=# select tableoid,cmin,cmax,xmin,xmax,ctid,* from test;
tableoid | cmin | cmax | xmin | xmax | ctid | id | name
------------+--------+--------+------+--------+---------+-----+--------------
24601 | 0 | 0 | 1852 | 0 | (0,2) | 2 | kenyonkenyon
24601 | 0 | 0 | 1852 | 0 | (0,3) | 3 | kenyonkenyon
24601 | 0 | 0 | 1853 | 0 | (0,4) | 4 | a
24601 | 0 | 0 | 1854 | 0 | (0,8) | 7 | keke
24601 | 1 | 1 | 1854 | 0 | (0,9) | 6 | kekeke
24601 | 2 | 2 | 1854 | 0 | (0,10) | 5 | kenyon_test
24601 | 0 | 0 | 1856 | 0 | (0,11) | 8 | jackson
(7 rows)
postgres=# select oid,relname,relfilenode,relkind from pg_class where oid = 24601;
oid | relname | relfilenode | relkind
--------+-----------+-------------+---------
24601 | test | 24601 | r
- Android之弹出/隐藏系统软键盘
Android弹出/隐藏系统软键盘的代码如下: InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT ...
- ios7隐藏系统底部导航
ios7隐藏系统底部导航 minimal-ui <meta id="viewport" name="viewport" content="wid ...
- iOS 隐藏系统的导航,使用自定义的导航
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @pr ...
- 解决JQuery中datatables设置隐藏显示列多次提交后台刷新数据的问题
此次项目开发过程中用到了Jquery的Datatables插件,无疑他是数据列表展示,解决MVC中同步过程中先走控制器后返回视图,查询数据过程中无法提示等待的弊端, 而且他所提供的各种方法也都有较强的 ...
- android如何调用显示和隐藏系统默认的输入法(一)
1.调用显示系统默认的输入法 方法一. InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_MET ...
- 利用 /proc/sys/kernel/core_pattern隐藏系统后门
ref:https://xz.aliyun.com/t/1098/ 这里所说的core_pattern 指的是:/proc/sys/kernel/core_pattern. 我们知道在Linux系统中 ...
- SpringBoot系统列 2 - 配置文件,多环境配置(dev,qa,online)
实现项目的多环境配置的方法有很多,比如通过在Pom.xml中配置profiles(最常见) 然后在Install项目打War包的时候,根据需求打不同环境的包,如图: 这种配置多环境的方法在SSM框架中 ...
- SpringBoot系统列 1 - HelloWorld!
学习SpringBoot系统列之HelloWorld! 1.新建一个Maven项目 2.添加POM配置 <parent> <groupId>org.springframewor ...
- jqgrid 让隐藏的列在编辑状态时出现且可编辑
有时,我们需要隐藏一个列数据,但在启动编辑时又能够被编辑. 1.设置列为编辑:editable: true 2.设置 editrules属性值为: edithidden: true colModel: ...
随机推荐
- Java并发编程-再谈 AbstractQueuedSynchronizer 1 :独占模式
关于AbstractQueuedSynchronizer JDK1.5之后引入了并发包java.util.concurrent,大大提高了Java程序的并发性能.关于java.util.concurr ...
- MySQL中间件之ProxySQL(7):详述ProxySQL的路由规则
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html 1.关于ProxySQL路由的简述 当ProxySQL收到前端app发 ...
- tiny210 tslib 测试(基于 ft5x06 触摸屏),解决触摸无效问题
1. 拷贝至开发板 将上次实验中的 tmp 文件夹拷贝到开发板,可以通过 nfs 来传输,并将 tmp/lib 下的所有 .so 文件拷贝至 开发板的 /usr/lib 中,并且确保库的映射关系正确. ...
- LeetCode Animation 题目图解汇总(持续更新中...)
我会尽力将LeetCode上所有的题目都用动画的形式演示出来,期待与你见证这一天! GitHub Repo:LeetCode Animation Follow: MisterBooo · GitHub ...
- 更新计算机名称后TFS文件无法迁出
本人最新刚刚最新了一下计算机名称,但在迁出TFS文件时报如下错误: 如果最近已重命名此计算机,则可通过运行“tf workspaces /updateComputerName:oldComputerN ...
- mysql循环插入数据、生成随机数及CONCAT函数
实现目标:一年12个月,每个月插入一条数据,score为1-5的随机数 循环语句: WHILE -- DO -- END WHILE DELIMITER ; CREATE PROCEDURE test ...
- C# 中 FindControl 方法及使用
FindControl 的使用方法 FindControl (String id): 在页命名容器中搜索带指定标识符的服务器控件.(有点类似javascript中的getElementById(st ...
- Javascript继承1:子类的的原型对象----类式继承
//声明父类 function Parent(){ this.parentValue = true; this.favorites = ['看书'] } //为父类添加公有方法 Parent.prot ...
- 记录使用Redis和nginx 实现一个简单的负载均衡(FB)
这两年在博客园看了不少大牛的分享,一直打算能写点什么东西. 之前偶然看见一个利用Redis 当作 Session数据宿主的demo,出处我已经找不到了.后来没事看了看nginx相关的东西.其中负载均衡 ...
- php的TS和NTS的区别
ts(Thread-Safety)即线程安全,多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他 线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数 ...