PostgreSQL系統列 System Columns

來源:互聯網
上載者:User

標籤:postgresql   系統列   system   

每個表都有隱藏的系統列,建立表列的時候不能和系統列名相同,下面講解一下PostgreSQL有哪些系統列.


(1)oid(4 bytes)

object identifier(即object ID)主要用於系統資料表如pg_class(記錄table的一個表),pg_namespace(記錄schema的一個表),

建立表時,如果指定with oids,則存在oid列。還可以由參數default_with_oids控制,預設是off,表示不加with oids建表時,沒有oid列。


eg:


#查看pg_class這個條記錄對應的oid

postgres=# select oid,relname from pg_class where oid=‘pg_class‘::regclass;

oid  | relname  

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

1259 | pg_class


#建立一個新的表


postgres=# create table t1(c1 integer,c2 varchar(20)) with oids;

CREATE TABLE


postgres=# insert into t1 select 1,‘aaa‘;

INSERT 16456 1


postgres=# insert into t1 values(2,‘bbb‘);

INSERT 16457 1


postgres=# \d+ t1;

                                 Table "public.t1"

Column |         Type          | Modifiers | Storage  | Stats target | Description

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

c1     | integer               |           | plain    |              |

c2     | character varying(20) |           | extended |              |

Has OIDs: yes


postgres=# select oid,c1,c2 from t1;

  oid  | c1 | c2  

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

16456 |  1 | aaa

16457 |  2 | bbb


(2)tableid(4 bytes)

表對象的一個唯一識別碼,一個表只對應一個tableoid,可以將tableoid與pgclass的oid列串連起來,以獲得表名


postgres=# select oid,tableoid from t1;

  oid  | tableoid

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

16456 |    16453

16457 |    16453

16458 |    16453


postgres=# select tableoid from t2;

tableoid

----------

    16464


postgres=# select oid,relname from pg_class ;

  oid  |                 relname                 

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

16453 | t1

16464 | t2


postgres=# select relname from pg_class where oid in (16453,16464);

relname

---------

t1

t2


(3)ctid(6 bytes)

在表中的一個物理位置標識符,和oracle的rowid類似,但有一點不同,當表被vacuum full或該行值被update時該值可能會改變。所以定義表值的唯一性最好還是自己建立一個序列值的主鍵列來標識比較合適


(4)xmin

是插入的事務標識符transaction ID,是用來標識不同事務下的一個版本控制。每一次更新該行都會改變這個值。可以和mvcc版本結合起來看


(5)xmax

是刪除更新的事務標識符transaction ID,如果該值不為0,則說明該行資料當前還未提交或復原。比如設定begin...commit事務時可以明顯看到該值的變化


(6)cmin

插入事務的命令標識符command identifier,從0開始


(7)cmax

刪除事務的命令標識符command identifier,或者為0


eg:

postgres=# create table t1(c1 integer,c2 varchar(20));

postgres=# insert into t1 select generate_series(1,3),repeat(‘hello‘,2);


#三行記錄的xmin一樣,表示是同一個事物

postgres=# select cmin,cmax,xmin,xmax,ctid,* from t1;

cmin | cmax | xmin | xmax | ctid  | c1 |     c2     

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

    0 |    0 | 1806 |    0 | (0,1) |  1 | hellohello

    0 |    0 | 1806 |    0 | (0,2) |  2 | hellohello

    0 |    0 | 1806 |    0 | (0,3) |  3 | hellohello


begin;

insert into t1 values(4,‘aaa‘);

insert into t1 values(5,‘bbb‘);

insert into t1 values(6,‘ccc‘);

commit;


#第四行,第五行,第六行的xmin不同,表示是不同的事物,cmin和cmax也都發生變化了

postgres=# select cmin,cmax,xmin,xmax,ctid,* from t1;

cmin | cmax | xmin | xmax | ctid  | c1 |     c2     

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

    0 |    0 | 1806 |    0 | (0,1) |  1 | hellohello

    0 |    0 | 1806 |    0 | (0,2) |  2 | hellohello

    0 |    0 | 1806 |    0 | (0,3) |  3 | hellohello

    0 |    0 | 1807 |    0 | (0,4) |  4 | aaa

    1 |    1 | 1807 |    0 | (0,5) |  5 | bbb

    2 |    2 | 1807 |    0 | (0,6) |  6 | ccc


session1:

postgres=# begin;

postgres=# update t1 set c2=‘cdhu‘ where c1=5;

postgres=# update t1 set c2=‘cdhucdhu‘ where c1=6;


#此時的ctid變化了:

postgres=# select cmin,cmax,xmin,xmax,ctid,* from t1;

cmin | cmax | xmin | xmax | ctid  | c1 |     c2     

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

    0 |    0 | 1806 |    0 | (0,1) |  1 | hellohello

    0 |    0 | 1806 |    0 | (0,2) |  2 | hellohello

    0 |    0 | 1806 |    0 | (0,3) |  3 | hellohello

    0 |    0 | 1807 |    0 | (0,4) |  4 | aaa

    0 |    0 | 1808 |    0 | (0,7) |  5 | cdhu

    1 |    1 | 1808 |    0 | (0,8) |  6 | cdhucdhu

(6 rows)


再開一個會話


session2:

#上面update事物還沒有結束,所以xmax現在不為0:

postgres=# select cmin,cmax,xmin,xmax,ctid,* from t1;

cmin | cmax | xmin | xmax | ctid  | c1 |     c2     

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

    0 |    0 | 1806 |    0 | (0,1) |  1 | hellohello

    0 |    0 | 1806 |    0 | (0,2) |  2 | hellohello

    0 |    0 | 1806 |    0 | (0,3) |  3 | hellohello

    0 |    0 | 1807 |    0 | (0,4) |  4 | aaa

    0 |    0 | 1807 | 1808 | (0,5) |  5 | bbb

    1 |    1 | 1807 | 1808 | (0,6) |  6 | ccc


session1:

postgres=# commit;


session2:

postgres=# select cmin,cmax,xmin,xmax,ctid,* from t1;

cmin | cmax | xmin | xmax | ctid  | c1 |     c2     

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

    0 |    0 | 1806 |    0 | (0,1) |  1 | hellohello

    0 |    0 | 1806 |    0 | (0,2) |  2 | hellohello

    0 |    0 | 1806 |    0 | (0,3) |  3 | hellohello

    0 |    0 | 1807 |    0 | (0,4) |  4 | aaa

    0 |    0 | 1808 |    0 | (0,7) |  5 | cdhu

    1 |    1 | 1808 |    0 | (0,8) |  6 | cdhucdhu


本文出自 “10979687” 部落格,請務必保留此出處http://10989687.blog.51cto.com/10979687/1972372

PostgreSQL系統列 System Columns

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.