文档章节

系统字段

VITO_ch123
 VITO_ch123
发布于 2016/07/06 15:54
字数 1243
阅读 12
收藏 0
点赞 0
评论 0

postgres建立的表中都有几个系统字段,这些字段是由系统隐含定义的,因此这些名字不能用于用户定义的字段名

oid     行对象标识符,这个字段只有在创建表的时候使用with oids 选项,或者配置 default_with_oids的值为真创建的表才有该字段,其类型为OID。

create table testoid(id int,content text) with oids;
create table test(id int,content text);

postgres=# \d+ testoid 
                        Table "public.testoid"
 Column  |  Type   | Modifiers | Storage  | Stats target | Description 
---------+---------+-----------+----------+--------------+-------------
 id      | integer |           | plain    |              | 
 content | text    |           | extended |              | 
Has OIDs: yes

postgres=# \d+ test
                          Table "public.test"
 Column  |  Type   | Modifiers | Storage  | Stats target | Description 
---------+---------+-----------+----------+--------------+-------------
 id      | integer |           | plain    |              | 
 content | text    |           | extended |              | 

从上面的例子我们可以知道,testoid 为Has OIDs:yes 而表test没有。

  tableoid  包含本行的表的oid,这个字段对那些从继承层次中选取的查询特别有用,因为如果没有他的话,我们很难说明一行来自哪个独立的表, tableoid 可以和pg_class中的oid字段连接起来获取表名。

postgres=# select a.tableoid,b.relname,a.id,a.content from testoid a,pg_class b where a.tableoid=b.oid;
 tableoid |  relname   | id  | content 
----------+------------+-----+---------
    16385 | testoid    |   0 | test0
    16399 | testoid001 |   1 | test1
    16399 | testoid001 |   3 | test3
    16405 | testoid002 | 101 | test101
    16411 | testoid003 | 202 | test202
(5 rows)

上面的例子我们知道数据来自某个表,以及和pg_class 连接知道表名。在分区表查询数据来源的时候很方便。

cmin,cmax

cmin:插入该元组的命令在插入事务中的命令标识(从0开始累加)

cmax:删除该元组的命令在插入事务中的命令标识(从0开始累加)

postgres=# select oid,cmin,cmax,* from testtable;
  oid  | cmin | cmax | id  | content 
-------+------+------+-----+---------
 16733 |    5 |    5 |   2 | test3
 16735 |    5 |    5 |   3 | 3test3
 16736 |    5 |    5 | 101 | test101
 16737 |    5 |    5 | 202 | test202
 16732 |    3 |    3 |   0 | 0test3
 16734 |    5 |    5 |   1 | 1test3

查询出cmin,cmax如上例所示。

xmin,cmax用于判断同一个事物内其他命令导致的行版本是否可见,如果一个事务内的所有命令严格顺序执行,那么每个命令总能看到之前该事务内的所有变更,然而一个事务内的命令交替执行,比如用游标进行查询,fetch游标时看到的是声明游标时候的数据快照而不是fetch执行时,即声明游标后对数据的变更对该游标不可见。

postgres=# begin;
BEGIN
postgres=# insert into testtable values (0,'test0');
INSERT 16739 1
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16739 | 1858 |    0 |    0 |    0 |  0 | test0
(1 row)
postgres=# declare tb1_v cursor for select xmin,xmax,cmin,cmax,id,content from  testtable ;
DECLARE CURSOR
postgres=# update testtable  set content ='0test0' where id=0;
UPDATE 1
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16739 | 1858 |    0 |    1 |    1 |  0 | 0test0
(1 row)
postgres=# fetch all from tb1_v;
 xmin | xmax | cmin | cmax | id | content 
------+------+------+------+----+---------
 1858 | 1858 |    0 |    0 |  0 | test0
(1 row)

xmin,xmax

xmin: 插入该行版本的事务ID,一个行版本是一行的一个状态。行的每一次更新都为同一个逻辑行创建一个新的行版本。

 xmax: 删除该行版本的事务ID,如果不是被删除的行版本,那么是零,在一个可见行版本里,这个字段有可能是非0,通常这事务还未被提交,或者被回滚掉。

postgres=# insert into testtable values (1,'test1');
INSERT 16740 1
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16740 | 1864 |    0 |    0 |    0 |  1 | test1
(1 row)
postgres=# insert into testtable values (2,'test2');
INSERT 16741 1
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16740 | 1864 |    0 |    0 |    0 |  1 | test1
 16741 | 1865 |    0 |    0 |    0 |  2 | test2
(2 rows)
--test2插入的id为1865
postgres=# select txid_current();
 txid_current 
--------------
         1866
(1 row)
当前的xmin为1866,那么下一个事务分配的xmin为1866

postgres=# begin ;
BEGIN
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16741 | 1865 |    0 |    0 |    0 |  2 | test2
 16740 | 1867 |    0 |    0 |    0 |  1 | 1test1
(2 rows)

postgres=# update testtable set content='1test1' where id=1;
UPDATE 1

postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16741 | 1865 |    0 |    0 |    0 |  2 | test2
 16740 | 1868 |    0 |    1 |    1 |  1 | 1test1
(2 rows)

当更新一个数据后,xmin更新为1868,重新打开一个session,查看
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16741 | 1865 |    0 |    0 |    0 |  2 | test2
 16740 | 1867 | 1868 |    0 |    0 |  1 | 1test1
(2 rows)

xmax为1868代表该事务未提及,如果提交,1867事务会被1868事务修改,xmin变成1868,如果rollback,那么xmax为1868,xmin为1867。
postgres=# rollback ;
ROLLBACK
postgres=# select oid,xmin,xmax,cmin,cmax,* from testtable;
  oid  | xmin | xmax | cmin | cmax | id | content 
-------+------+------+------+------+----+---------
 16741 | 1865 |    0 |    0 |    0 |  2 | test2
 16740 | 1867 | 1868 |    0 |    0 |  1 | 1test1

 ctid 一个行版本在它所处的表内的物理位置,请注意,尽管ctid可以用于非常快速的定位行版本,但是每次vacuum full之后,一个行的ctid都会被更新或者移动,因此ctid不能作为长期的标识符,应该使用oid或者自定义标识符。

注意:

    不要假设oid是跨表唯一的,如果需要全数据库内的标识,请使用tableoid和oid的组合。

© 著作权归作者所有

共有 人打赏支持
VITO_ch123
粉丝 1
博文 20
码字总数 68787
作品 0
长沙
LTE系统信息(3)-系统信息变更

1.为什么需要加入系统信息变更机制 从《LTE系统信息(2)-SIB的周期调度》里我们已经知道,UE所需的系统信息绝大多数都包含在不同的SIB块里,分别由SIB1消息和SI消息广播到UE。携带的这些参数...

m_052148 ⋅ 2016/10/25 ⋅ 0

Winform开发框架之字段权限控制

在我的很多Winform开发项目中(包括混合框架的项目),统一采用了权限管理模块来进行各种权限的控制,包括常规的功能权限(按钮、菜单权限)、数据权限(记录的权限),另外还可以进行字段级...

walb呀 ⋅ 2017/12/04 ⋅ 0

新手学堂:Ubuntu Linux系统的启动过程

启动 GRUB/LILO运行 Linux 的系统内核 读取系统引导配置文件 /etc/inittab 中的信息运行系统的第一个进程 init执行系统初始化脚本 /etc/init.d/rcS根据运行级别(X)配置服务执行 /etc/init....

范堡 ⋅ 2009/05/24 ⋅ 0

《捷哥浅谈Drupal》第四弹之配置–用户配置详解

Drupal7.22安装过程中已经对站点进行了初步的简单的配置,更多复杂的配置管理员登录之后可以通过点击管理菜单当中的“配置”来进行设置,Drupal7.22对站点的设置非常地详细,包含对用户、内容...

LAMP李捷 ⋅ 2013/05/09 ⋅ 1

linux帐号管理详解:/etc/passwd 和/etc/shadow

1、/etc/passwd (帐号重要参数文件), 来cat /etc/passwd看一下: 乍看一下觉得这东西很深奥, 于是就放弃了. 那你就完蛋了. 这不是一个好习惯 , 其实很多事情只是看似很难, 如果你静下心来去了...

lisn ⋅ 2015/03/27 ⋅ 0

1.【ThinkPHP 开发辅助系统】数据库和视图设计

项目初始化 1.按thinkphp的开发流程先初始化项目并配置好数据库连接参数。2.从官网下载【辅助系统】,是以tp模块的形式,模块名称为Dev,并且不可更改。3.【辅助系统】默认登陆账号为:admin...

真友 ⋅ 2016/01/18 ⋅ 0

linux和windows互传文件 用户配置文件和密码配置文件 用户组管理 用户管理

1.lrzsz:本地window系统和远程服务器Linux系统互传文件 远程工具只能使用Xshell, SecureCRT,不能使用Putty sz:从Linux向window传东西 用法:sz 文件名 rz:从window向Linux传东西 用法:r...

oschina130111 ⋅ 06/08 ⋅ 0

系统为什么是树形?与宇宙的统一。

Anycmd为访问受控的托管资源记录添加了AcContentType和AcContent字段。 AcContentType字段取值形如: text/javascript text/xacml text/javascript,fileLocation text/xacml,fileLocation 当......

anycmd ⋅ 2015/01/07 ⋅ 6

系统监控工具--Atop

atop 是一款用于监控Linux系统资源与进程的工具,它以一定的频率记录系统的运行状态,所采集的数据包含系统资源(CPU、内存、磁盘和网络)使用情况和进程运行情况,并能以日志文件的方式保存在...

匿名 ⋅ 2010/01/26 ⋅ 1

关于关系型数据库的松耦合

之前一直没想过这个问题,后来数据库经常要变更,问题就越来越严重了。 例如有一个 User表,tab_user,3个字段,id,name,pwd. 文章表,tab_article,3个字段,id,title,content,uid. 文章类别,ta...

白起 ⋅ 2012/06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SpringCloud 微服务 (六) 服务通信 RestTemplate

壹 通信的方式主要有两种,Http 和 RPC SpringCloud使用的是Http方式通信, Dubbo的通信方式是RPC 记录学习SpringCloud的restful方式: RestTemplate (本篇)、Feign 贰 RestTemplate 类似 Http...

___大侠 ⋅ 9分钟前 ⋅ 0

React创建组件的三种方式

1.无状态函数式组建 无状态函数式组件,也就是你无法使用State,也无法使用组件的生命周期方法,这就决定了函数组件都是展示性组件,接收Props,渲染DOM,而不关注其他逻辑。 无状态函数式组...

kimyeongnam ⋅ 15分钟前 ⋅ 0

react 判断实例类型

今天在写组件的时候想通过判断内部子元素不同而在父元素上应用不同的class,于是首先要解决的就是如何判断子元素的类型。 这里附上一个讲的很全面的文章: https://www.cnblogs.com/onepixel...

球球 ⋅ 22分钟前 ⋅ 0

Centos7备份数据到百度网盘

一、关于 有时候我们需要进行数据备份,如果能自动将数据备份到百度网盘,那将会非常方便。百度网盘有较大的存储空间,而且不怕数据丢失,安全可靠。下面简单的总结一下如何使用 bypy 实现百...

zctzl ⋅ 36分钟前 ⋅ 0

开启远程SSH

SSH默认没有开启账号密码登陆,需要再配置表中修改: vim /etc/ssh/sshd_configPermitRootLogin yes #是否可以使用root账户登陆PasswordAuthentication yes #是都开启密码登陆ser...

Kefy ⋅ 39分钟前 ⋅ 0

Zookeeper3.4.11+Hadoop2.7.6+Hbase2.0.0搭建分布式集群

有段时间没更新博客了,趁着最近有点时间,来完成之前关于集群部署方面的知识。今天主要讲一讲Zookeeper+Hadoop+Hbase分布式集群的搭建,在我前几篇的集群搭建的博客中已经分别讲过了Zookeep...

海岸线的曙光 ⋅ 46分钟前 ⋅ 0

js保留两位小数方法总结

本文是小编针对js保留两位小数这个大家经常遇到的经典问题整理了在各种情况下的函数写法以及遇到问题的分析,以下是全部内容: 一、我们首先从经典的“四舍五入”算法讲起 1、四舍五入的情况...

孟飞阳 ⋅ 今天 ⋅ 0

python log

python log 处理方式 log_demo.py: 日志代码。 #! /usr/bin/env python# -*- coding: utf-8 -*-# __author__ = "Q1mi""""logging配置"""import osimport logging.config# 定义三种......

inidcard ⋅ 今天 ⋅ 0

mysql 中的信息数据库以及 shell 查询 sql

Information_schema 是 MySQL 自带的信息数据库,里面的“表”保存着服务器当前的实时信息。它提供了访问数据库元数据的方式。 什么是元数据呢?元数据是关于数据的数据,如数据库名或表名,...

blackfoxya ⋅ 今天 ⋅ 0

maven配置阿里云镜像享受飞的感觉

1.在maven目录下的conf/setting.xml中找到mirrors添加如下内容,对所有使用改maven打包的项目生效。 <mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.al......

kalnkaya ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部