8.11. 對象標識符類型

PostgreSQL 在內部使用對象標識符 (OID)作為各種系統表的主鍵.同時,系統還給用戶創建的表增加一個 OID 系統字段(除非在建表時聲明了 WITHOUT OIDS).類型 oid 代表一個對象標識符.除此以外還有幾個 oid 的別名︰ regprocregprocedureregoperregoperatorregclass,和 regtypeTable 8-19 顯示了概要。

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

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

OID 別名類型沒有自己的操作,除指明的輸入和輸出過程之外. 這些過程可以為系統對象接受和顯示符號名,而不僅僅是類型 oid 將要使用的行數值.別名類型允許我們簡化為對象查找 OID 值的過程︰ 比如,我們可以寫 'mytable'::regclass 以獲取表 mytable 的 OID,而不是 SELECT oid FROM pg_class WHERE relname = 'mytable'. (實際上,如果在不同的模式裡有多個叫 mytable 的表, 我們就需要一個更復雜的SELECT來處理從不同模式中選出正確的 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 裡有更多解釋。)