?
This document uses PHP Chinese website manual Release
PostgreSQL在內部使用對象標識符(OID)作為各種系統(tǒng)表的主鍵。 同時,系統(tǒng)不會給用戶創(chuàng)建的表增加一個 OID 系統(tǒng)字段(除非在建表時聲明了WITH OIDS或者配置參數(shù)default_with_oids 設置為開啟)。oid類型代表一個對象標識符。 除此以外oid還有幾個別名:regproc,regprocedure, regoper,regoperator,regclass,regtype, regconfig和regdictionary。 Table 8-23顯示了概覽。
目前oid類型用一個四字節(jié)的無符號整數(shù)實現(xiàn)。 因此,它不夠提供大數(shù)據(jù)庫范圍內的唯一性保證,甚至在單個的大表中也不行。 因此,我們不鼓勵在用戶創(chuàng)建的表中使用OID字段做主鍵。OID最好只是用于系統(tǒng)表。
oid類型本身除了比較之外還有幾個操作。 不過,它可以轉換為整數(shù),然后用標準的整數(shù)操作符操作。 如果你這么干,請注意可能的有符號和無符號之間的混淆。
OID別名類型除了輸入和輸出過程之外沒有自己的操作。 這些過程可以為系統(tǒng)對象接受和顯示符號名,而不僅僅是類型oid將要使用的行數(shù)值。 別名類型允許我們簡化為對象查找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的輸入轉換器處理根據(jù)模式路徑設置的表檢索工作, 所以它自動干了"正確的事情"。類似的還有, 把一個表的OID轉換成regclass是查找一個OID對應的符號名稱的最簡單方法。
Table 8-23. 對象標識符類型
名字 | 引用 | 描述 | 數(shù)值例子 |
---|---|---|---|
oid | 任意 | 數(shù)字化的對象標識符 | 564182 |
regproc | pg_proc | 函數(shù)名字 | sum |
regprocedure | pg_proc | 帶參數(shù)類型的函數(shù) | sum(int4) |
regoper | pg_operator | 操作符名 | + |
regoperator | pg_operator | 帶參數(shù)類型的操作符 | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | 關系名 | pg_type |
regtype | pg_type | 數(shù)據(jù)類型名 | integer |
regconfig | pg_ts_config | 全文檢索配置 | english |
regdictionary | pg_ts_dict | 全文檢索路徑 | simple |
所有OID別名類型都接受有模式修飾的名字, 并且如果在當前搜索路徑中不增加修飾無法找到該對象的話, 那么在輸出時將顯示有模式修飾的名字。 regproc和regoper別名類型將只接受唯一的輸入名字(不能重載), 因此它們的用途有限。對于大多數(shù)應用,regprocedure或regoperator更合適。 對于regoperator,單目操作符是通過在 那些未用的操作數(shù)上寫NONE來標識的。
OID別名類型的一個額外的屬性是依賴關系的創(chuàng)建。如果這些類型之一的常量 出現(xiàn)在一個存儲的表達式里(比如字段缺省表達式或者視圖), 它在被引用的對象上創(chuàng)建一個依賴性。比如,如果一個字段有缺省的 nextval('my_seq'::regclass)表達式, PostgreSQL理解缺省表達式依賴于 序列my_seq;系統(tǒng)將不允許在刪除缺省的表達式之前刪除該序列。
系統(tǒng)使用的另外一個標識符類型是事務(縮寫xact)標識符xid。 它是系統(tǒng)字段xmin和xmax的數(shù)據(jù)類型。 事務標識符是32位的量。
系統(tǒng)需要的第三種標識符類型是命令標識符cid。 是系統(tǒng)字段cmin和cmax的數(shù)據(jù)類型。 命令標識符也是32位的量。
系統(tǒng)使用的最后一個標識符類型是行標識符tid。 它是系統(tǒng)表字段ctid的數(shù)據(jù)類型。 行ID是一對數(shù)值(塊號,塊內的行索引),它標識該行在其所在表內的物理位置。
系統(tǒng)字段在Section 5.4里有更多解釋。