视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
postgresqlsystemcolumns
2020-11-09 16:07:08 责编:小采
文档


postgresql system columns 每张表都有这么一些隐含列,我们需要了解一下,但是不需要去深究,知道他们含义,以及如何使用即可。 oid:object ID的缩写,32bit,建表时候用with oids,或者是配置default_with_oids参数,这个值并不是唯一,除非自己采取别的

postgresql system columns

每张表都有这么一些隐含列,我们需要了解一下,但是不需要去深究,知道他们含义,以及如何使用即可。

oid:object ID的缩写,32bit,建表时候用with oids,或者是配置default_with_oids参数,这个值并不是唯一,除非自己采取别的措施保证唯一

举例: create table t1 (a int) with (oid=true);

insert into t1 values(1);

select oid, * from t1;

oid | a

-------+---

169 | 1

tableoid:表对象表示符。该列对于从继承层次中进行查询非常有用,如果没有它,就很难说清行记录来自那个表。tableoid列与数据字典pg_class的oid进行关联可以获取表名。

举例:postgres=# select tableoid from t1;

tableoid

----------

166

postgres=# select relname,relnamespace from pg_class where oid=166;

relname | relnamespace

---------+--------------

t1 | 2200

xmin:行插入事务标识,行的插入会更新此xmin

举例:

postgres=# begin;

BEGIN

postgres=# select txid_current();

txid_current

--------------

1722

(1 row)

postgres=# insert into t(i) values(5);

INSERT 0 1

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

7 | 5 | 1713 | 0

10000004 | 5 | 1719 | 0

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

(4 rows)

postgres=# end;

COMMIT

cmin:插入时的命令标识,从0开始

xmax:删除事务标识,对数据做删除和更新都会更改,该值为非0值时表示删除事务还没有提交,或者试图进行回滚,也就是说这里改值可能有三种状态。

举例:未提交(insert and update)

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

7 | 5 | 1713 | 0

10000004 | 5 | 1719 | 0

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

(4 rows)

postgres=# begin;

BEGIN

postgres=# select txid_current();

txid_current

--------------

1723

(1 row)

postgres=# delete from t where s=7;

DELETE 1

未提交开启另一session:

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

7 | 5 | 1713 | 1723

10000004 | 5 | 1719 | 0

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

delete rollback事务:

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

10000004 | 5 | 1719 | 0

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

(3 rows)

postgres=# begin;

BEGIN

postgres=# select txid_current();

txid_current

--------------

1724

(1 row)

postgres=# delete from t where s=10000004;

DELETE 1

postgres=# rollback;

ROLLBACK

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

10000004 | 5 | 1719 | 1724

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

(3 rows)

update rollback事务:

postgres=# select *,xmin,xmax from t where i=5 limit 10;

s | i | xmin | xmax

----------+---+------+------

10000004 | 5 | 1719 | 1724

10000005 | 5 | 1721 | 0

10000006 | 5 | 1722 | 0

(3 rows)

postgres=# begin;

BEGIN

postgres=# select txid_current();

txid_current

--------------

1725

(1 row)

postgres=# update t set i=10 where s=10000004;

UPDATE 1

postgres=# rollback;

ROLLBACK

postgres=# select *,xmin,xmax from t where s=10000004 limit 10;

s | i | xmin | xmax

----------+---+------+------

10000004 | 5 | 1719 | 1725

update 提交事务:

postgres=# select *,xmin,xmax from t where s=10000004 limit 10;

s | i | xmin | xmax

----------+---+------+------

10000004 | 5 | 1719 | 1725

(1 row)

postgres=# begin;

BEGIN

postgres=# select txid_current();

txid_current

--------------

1726

(1 row)

postgres=# update t set i=20 where s=10000004;

UPDATE 1

postgres=# commit;

COMMIT

postgres=# select *,xmin,xmax from t where s=10000004 limit 10;

s | i | xmin | xmax

----------+----+------+------

10000004 | 20 | 1726 | 0

总结一下,也就是说不管回滚还是未提交,都会获取新的事务号,但是在update提交的情况下,xmax归零,xmin获取当前事务号。

cmax:删除事务内部的命令标识

txid:有了以上的例子,很好理解了,就是事务ID,这个可不是表的隐含列哦

下载本文
显示全文
专题