5.2. 系統字串

每個資料表都有幾個系統字串,這些字串是由系統隱含定義的。 因此,這些名字不能用於用戶定義的字串名。 (請注意這些限制與這個名字是否關鍵字無關;把名字用引號括起來並不能讓您逃離這些限制。) 您實際上不需要注意這些字串,只要知道它們存在就可以了。

oid

一行的對象標識符(對像 ID)。這是一個序列號,是由 PostgreSQL 給所有資料表的行自動追加的 (除非建資料表的時候用了 WITHOUT OIDS,這種情況下就不會出現這個字串)。 這個字串的類型是 oid(和字串同名); 參閱 Section 8.12 獲取有關這種類型的更多訊息。

tableoid

包含本行的資料表的 OID。這個字串對那些從繼承層次中選取的查詢特別有用, 因為如果沒有它的話,我們就很難說明一行來自哪個獨立的資料表。 tableoid 可以和 pg_classoid 字串連接起來獲取資料表名字。

xmin

插入該行版本的交易的標識(交易 ID)。(注意:在這個環境裡, 一個行版本是一行的一個狀態;一行的每次更新都為同一個邏輯行建立一個新的行版本。)

cmin

在插入交易內部的命令標識(從零開始)。

xmax

刪除交易的標識(交易ID),如果不是被刪除的行版本,那麼是零。 在一個可見行版本裡,這個字串有可能是非零。這通常意味著刪除交易還沒有提交, 或者是一個刪除的企圖被回滾掉了。

cmax

在刪除交易內部的命令標識符,或者是零。

ctid

一個行版本在它所處的資料表內的實際位置。請注意,儘管 ctid 可以用於非常快速地定位行版本,但每次 VACUUM FULL 之後, 一個行的 ctid 都會被更新或者移動。 因此 ctid 是不能作為長期的行標識符的。 應該使用OID,或者更好是用戶定義的序列號,來標識一個邏輯行。

OID 是 32 位的量,是在同一個集群內通用的計數器上賦值的。 對於一個大型或者長時間使用的資料庫,這個計數器是有可能重疊的。 因此,假設 OID 是唯一的是非常錯誤的,除非您自己採取了措施來保證它們是唯一的。 如果您需要標識資料表中的行,我們強烈建議使用序列號生成器。 不過,也可以使用 OID,只要採取幾個注意事項即可:

交易標識符也是 32 位的量。在長時間運轉的資料庫裡,它也可能會重疊。 只要我們採取一些合適的維護步驟,這並不是很要命的問題; 參閱 Chapter 21 獲取細節。不過, 在長時間執行的環境裡(超過十億次交易)依賴交易 ID 的唯一性並非明智的做法。

命令標識符也是 32 位的量。這樣就在一個交易裡有232(四十億)條 SQL 命令的硬限制。 在現實裡這個限制應該不是什麼問題 — 注意這個限制是 SQL 命令的條數, 而不是處理的行版本的條數。