PostgreSQL中的Object Identifier(oid)數據類型


PostgreSQL在內部使用對象標識符(OID)作為各種系統表的主鍵。OID不會添加到用戶創建的表中,除非在創建表時指定了WITH OIDS,或者啟用了default_with_oids配置變量。類型oid表示對象標識符。oid還有幾種別名類型:regproc,regprocedure,regoper,regoperator,regclass,regtype,regrole,regnamespace,regconfig和regdictionary。

oid類型當前的實現為無符號的四字節整數。因此,它不足以在大型數據庫或甚至大型單個表中提供數據庫范圍的唯一性。因此,不鼓勵使用用戶創建的表的OID列作為主鍵。OID最好僅用於對系統表的引用。

oid類型本身幾乎沒有比較的操作。但是,它可以轉換為整數,然后使用標准整數運算符進行操作。(如果這樣做,請注意可能存在有符號與無符號的混淆。)

除了專門的輸入和輸出routines之外,OID別名類型沒有自己的操作。這些routines能夠接受和顯示系統對象的符號名稱,而不是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的表,則需要更復雜的子選擇來選擇正確的OID。regclass輸入轉換器根據模式路徑設置處理表查找,因此它自動執行“正確的事情”。類似地,將表的OID強制轉換為regclass對於數字OID的符號顯示非常方便。

按namespace分組的對象的所有OID別名類型都接受模式限定名稱,並且如果在沒有限定的情況下在當前搜索路徑中找不到該對象,則將在輸出上顯示模式限定名稱。regproc和regoper別名類型只接受唯一(不過載)的輸入名稱,因此它們的用途有限;對於大多數用途,regprocedure或regoperator更合適。對於regoperator,通過為未使用的操作數寫入NONE來標識一元運算符。

大多數OID別名類型的附加屬性是依賴項的創建。如果這些類型之一的常量出現在存儲的表達式(例如列默認表達式或視圖)中,則會對引用的對象創建依賴關系。例如,如果列具有默認表達式nextval('my_seq'::regclass),則PostgreSQL理解默認表達式取決於序列my_seq;如果沒有先刪除默認表達式,系統將不會刪除序列。regrole是該特性的唯一例外。此類表達式中不允許使用此類型的常量。

OID別名類型不完全遵循事務隔離規則。 計划器還將它們視為簡單的常數,這可能導致次優的執行計划。

 

系統使用的另一種標識符類型是xid或事務(縮寫為xact)標識符。這是系統列xmin和xmax的數據類型。事務標識符是32位長度的。

系統使用的第三種標識符類型是cid或命令標識符。這是系統列cmin和cmax的數據類型。命令標識符也是32位長度的。

系統使用的最后一類標識符類型是tid或元組標識符(行標識符)。這是系統列ctid的數據類型。元組ID是一對(塊號,塊內的元組索引),用於標識其表中行的物理位置。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM