8.11. オブジェクト識別子データ型

オブジェクト識別子(OID)はPostgreSQLの内部で様々なシステムテーブルのプライマリキーとして使用されます。 また、(テーブルの作成時にWITHOUT OIDSが指定されていない場合、)OIDシステム列がユーザ作成のテーブルに追加されます。 oidデータ型はオブジェクト識別子を表します。 oidには別名もいくつかあります。 regprocregprocedureregoperregoperatorregclass、およびregtypeです。 表8-19に概要を示します。

oidデータ型は現在、符号無し4バイト整数として実装されています。 これは、大規模なデータベースの全体にわたって一意とするには十分ではありません。 大規模な個別のテーブル内においても十分ではないかもしれません。 そのため、ユーザ作成テーブルのOID列をプライマリキーとして使用するのはお勧めできません。 OIDの使用は、システムテーブルへの参照の場合にのみ推奨されます。

oidデータ型自体は、比較以外の演算はほとんど行いません。 しかし、整数としてキャストすることもでき、その場合標準の整数演算子を使用して操作することができます。 (これを行うと、符号つきと符号なしの間で混乱が起きかねないことに注意してください。)

OIDの別名データ型は、専用の入出力ルーチン以外には演算を行いません。 これらのルーチンでは、oid型が使用するような未加工の数値ではなく、システムオブジェクト用のシンボル名を受け入れたり表示したりできます。 別名データ型により、オブジェクトのOID値の検索が簡単になります。 たとえば、mytableテーブルのOIDを取得するために、SELECT oid FROM pg_class WHERE relname = 'mytable'の代わりに'mytable'::regclassと記述できます。 (現実には、異なるスキーマにmytableテーブルが複数ある場合には、正しいOIDを選択するために、より複雑なSELECTが必要となります。)

表 8-19. オブジェクト識別子データ型

型名参照説明値の例
oidすべて数値オブジェクト識別子564182
regprocpg_proc関数名sum
regprocedurepg_proc引数の型を持つ関数sum(int4)
regoperpg_operator演算子名+
regoperatorpg_operator引数の型を持つ演算子*(integer,integer) or -(NONE,integer)
regclasspg_classリレーション名pg_type
regtypepg_typeデータ型名integer

すべてのOID別名型はスキーマ修飾名を受け入れ、出力時にスキーマ修飾名を表示します。 ただし、現在の検索パスでオブジェクトが見つけられなければ、修飾せずに出力します。 regprocregoper別名型は、一意な(オーバーロードしていない)名前のみを入力として受け入れるため、これらの使用には限度があります。 ほとんどの場合、regprocedureまたはregoperatorを使用するのが適切です。 regoperatorの場合、単項演算子は未使用のオペランドをNONEと記述することによって指定されます。

システムが使用するもう1つの識別子の型はxid、すなわちトランザクション(略してxact) 識別子です。 これは、xminシステム列およびxmaxシステム列のデータ型です。 トランザクション識別子は 32 ビット長です。

システムが使用する3つ目の識別子はcid、すなわちコマンド識別子です。 これは、cminシステム列およびcmaxシステム列のデータ型です。 コマンド識別子も 32 ビット長です。

システムが使用する最後の識別子はtid、すなわちタプル識別子(行識別子)です。 これは、ctidシステム列のデータ型です。 タプルIDは、テーブル内の行の物理的位置を識別するための組(ブロック番号、ブロック内のタプルインデックス)です。

(システム列の詳細は項5.2で説明します。)