| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 5. 數據定義 | Fast Forward | Next |
每個表都有幾個系統字段,這些字段是由系統 隱含定義的。因此,這些名字不能用于用戶定義的字段名。 (請注意這些限制與這個名字是否關鍵字無關;把名字用引號 括起來並不能讓你逃離這些限制。)你實際上不需要注意這些字段, 只要知道它們存在就可以了。
一行的對象標識符(對象 ID)。這是一個序列號,是由 PostgreSQL 給所有表的行自動追加的 (除非建表的時候用了 WITHOUT OIDS,這種情況下 就不會出現這個字段)。這個字段的類型是 oid (和字段同名);參閱 Section 8.11 獲取有關這種 類型的更多信息。
包含本行的表的 OID。這個字段對那些從繼承層次中選取的查詢特別有用, 因為如果沒有它的話,我們就很難說明一行來自哪個獨立的表。 tableoid 可以和 pg_class 的 oid 字段連接起來獲取表名字。
插入該行版本的事務的標識(事務 ID)。(注意:在這個環境裡, 一個行版本是一行的一個狀態;一行的每次更新都為同一個邏輯行創建一個新的行版本。)
在插入事務內部的命令標識(從零開始)。
刪除事務的標識(事務ID),如果不是被刪除的行版本,那麼是零。 在一個可見行版本裡,這個字段有可能是零:這通常意味著刪除事務還沒有提交, 或者是一個刪除的企圖被回滾掉了。
在刪除事務內部的命令標識符,或者是零。
一個行版本在它所處的表內的物理位置。請注意,盡管 ctid 可以用于非常快速地定位行版本,但每次 VACUUM FULL 之後, 一個行的 ctid 都會被更新或者移動。 因此 ctid 是不能作為長期的行標識符的。 應該使用OID,或者更好是用戶定義的序列號,來標識一個邏輯行。
OID 是 32 位的量,是在同一個集群內通用的計數器上賦值的。 對于一個大型或者長時間使用的數據庫,這個計數器是有可能重疊的。 因此,假設 OID 是唯一的是非常錯誤的,除非你自己採取了措施來保證這個唯一。 在使用 OID 作為行的標識符的時候,我們建議採用的措施是在使用 OID 的每個表的 OID 字段創建一個唯一約束。絕對不要假設 OID 是跨表唯一的;如果你需要全數據庫 範圍內的標識,請使用 tableoid 和行的 OID 的組合。 (將來的 PostgreSQL 版本很可能為每個表使用獨立的 OID 計數器,這樣 tableoid 就必須包含在全局唯一 標識的實現裡面。)
事務標識符也是 32 位的量。在長時間運轉的數據庫裡,它也可能會重疊。 只要我們採取一些合適的維護步驟,這並不是很要命的問題; 參閱 Chapter 21 獲取細節。不過,在長時間運行的 環境裡(超過十億次事務)依賴事務 ID 的唯一性並非明智的做法。
命令標識符也是 32 位的量。這樣就在一個事務裡有232(四十億) 條 SQL 命令的硬限制。在現實裡這個限制應該不是 什麼問題 --- 注意這個限制是 SQL 命令的條數, 而不是處理的行版本的條數。