8.12. 對像標識符類型

PostgreSQL 在內部使用對像標識符(OID)作為各種系統資料表的主鍵。 同時,系統還給用戶建立的資料表增加一個 OID 系統字串(除非在建資料表時聲明了 WITHOUT OIDS 或者是配置參數 default_with_oids 設置成了假)。 類型 oid 代資料表一個對像標識符。除此以外還有幾個 oid 的別名: regprocregprocedureregoperregoperatorregclass,和 regtypeTable 8-19 顯示了概要。

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

注意: PostgreSQL 8.0.0 裡,用戶建立的資料表預設時有 OID。 不過,這個行為在將來的 PostgreSQL 版本裡很有可能改變。 最後,用戶建立的資料表將不包括 OID 系統字串,除非在建立資料表的時候聲明了 WITH OIDS, 或者配置參數 default_with_oids 設置為真。如果您的應用要求資料表裡面有一個系統字串 OID, 那麼應該在建立資料表的時候聲明 WITH OIDS,以保證與將來的 PostgreSQL 版本兼容。

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 對應的符號名稱的最簡單方法。

Table 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 別名類型將只接受唯一的輸入名字(不能重載),因此它們的用途有限; 對於大多數應用,regprocedureregoperat或者 更合適。對於 regoperat或者,單目操作符是透過在那些未用的操作數 上寫NONE來標識的。

系統使用的另外一個標識符類型是 xid,或者說是交易(縮寫xact) 標識符。它是系統字串 xminxmax 的 資料類型。交易標識符是 32 位的量。

系統需要的第三種標識符類型是 cid,或者命令標識符。 它是系統字串 cmincmax 的資料類型。 命令標識符也是 32 位的量。

系統使用的最後的標識符類型是 tid,或者說是資料標識符。 它是系統資料表字串 ctid 的資料類型。資料 ID 是一對兒數值 (塊號,塊內的資料索引),它標識該資料在其所在資料表內的實際位置。

(系統字串在 Section 5.2 裡有更多解釋。)