PostgreSQL 8.2.3 中文文檔
後退快退章8. Data Types快進前進

8.12. 對象標識符類型

PostgreSQL在內部使用對象標識符(OID)作為各種係統表的主鍵。同時,係統不會給用戶創建的表增加一個 OID 係統字段(除非在建表時聲明了 WITH OIDS 或者配置參數 default_with_oids 設置為開啟)。oid 類型代表一個對象標識符。除此以外 oid 還有幾個彆名:regproc, regprocedure, regoper, regoperator, regclass, regtype表8-19顯示了概覽。

目前 oid 類型用一個四字節的無符號整數實現。因此,它不夠提供大數據庫範圍內的唯一性保證,甚至在單個的大表中也不行。因此,我們不鼓勵在用戶創建的表中使用 OID 字段做主鍵。OID 最好隻是用於係統表。

oid 類型本身除了比較之外還有幾個操作。不過,它可以轉換為整數,然後用標準的整數操作符操作。如果你這麼乾,請注意可能的有符號和無符號之間的混淆。

OID 彆名類型除了輸入和輸出過程之外冇有自己的操作。這些過程可以為係統對象接受和顯示符號名,而不僅僅是類型 oid 將要使用的行數值。彆名類型允許我們簡化為對象查找 OID 值的過程。比如,檢查和一個表 mytable 相關的 pg_attribute 行,我們可以這樣寫

SELECT * FROM pg_attribute WHERE attrelid = 'mytable'::regclass;

而不用

SELECT * FROM pg_attribute
  WHERE attrelid = (SELECT oid FROM pg_class WHERE relname = 'mytable');

雖然看上去不壞,但是這個例子還是簡化了好多,如果在不同的模式裡有好多叫 mytable 的表,那麼我們需要寫一個更複雜的子查詢。regclass 的輸入轉換器處理根據模式路徑設置的表檢索工作,所以它自動乾了"正確的事情"。類似的還有,把一個表的 OID 轉換成 regclass 是查找一個 OID 對應的符號名稱的最簡單方法。

表8-19. 對象標識符類型

名字引用描述數值例子
oid任意數字化的對象標識符564182
regprocpg_proc函數名字sum
regprocedurepg_proc帶參數類型的函數sum(int4)
regoperpg_operator操作符名+
regoperatorpg_operator帶參數類型的操作符*(integer,integer)-(NONE,integer)
regclasspg_class關係名pg_type
regtypepg_type數據類型名integer

所有 OID 彆名類型都接受有模式修飾的名字,並且如果在當前搜索路徑中不增加修飾無法找到該對象的話,那麼在輸出時將顯示有模式修飾的名字。regprocregoper 彆名類型將隻接受唯一的輸入名字(不能重載),因此它們的用途有限。對於大多數應用,regprocedureregoperator 更合適。對於 regoperator,單目操作符是通過在那些未用的操作數上寫 NONE 來標識的。

OID 彆名類型的一個額外的屬性是如果這些類型之一的常量出現在一個存儲的表達式裡(比如字段缺省表達式或者視圖),它在被引用的對象上創建一個依賴性。比如,如果一個字段有缺省的 nextval('my_seq'::regclass) 表達式,PostgreSQL 理解缺省表達式依賴於序列 my_seq ;係統將不允許在刪除缺省的表達式之前刪除該序列。

係統使用的另外一個標識符類型是事務(縮寫 xact)標識符 xid 。它是係統字段 xminxmax 的數據類型。事務標識符是 32 位的量。

係統需要的第三種標識符類型是命令標識符 cid。它是係統字段 cmincmax 的數據類型。命令標識符也是 32 位的量。

係統使用的最後一個標識符類型是行標識符 tid 。它是係統表字段 ctid 的數據類型。行 ID 是一對數值(塊號,塊內的行索引),它標識該行在其所在表內的物理位置。

係統字段在節5.4裡有更多解釋。


後退首頁前進
複合類型上一級偽類型