オブジェクト識別子(OID)はPostgreSQLの内部で様々なシステムテーブルのプライマリキーとして使用されます。 また、テーブル作成時にWITH OIDSが指定されているか、default_with_oids設定変数が有効な場合を除き、ユーザ作成のテーブルにはOIDは追加されません。 oidデータ型はオブジェクト識別子を表します。 oidには別名型もいくつかあります。 regproc、regprocedure、regoper、regoperator、regclass、regtype、regconfig、およびregdictionaryです。 表8-19に概要を示します。
oidデータ型は現在、符号なし4バイト整数として実装されています。 これは、大規模なデータベースの全体にわたって一意とするには十分ではありません。 大規模な個別のテーブル内においても十分ではないかもしれません。 そのため、ユーザ作成テーブルのOID列をプライマリキーとして使用するのはお勧めできません。 OIDの使用は、システムテーブルへの参照の場合にのみ推奨されます。
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テーブルが複数ある場合には、正しいOIDを選択するために、より複雑なSELECTが必要となります。 regclass入力変換ではスキーマパスの設定に従ってテーブル検索を扱いますので、自動的に"正しい検索"を行います。 同様に、テーブルのOIDをregclassにキャストすることは、数値のOIDのシンボル表示に便利です。
表 8-19. オブジェクト識別子データ型
型名 | 参照 | 説明 | 値の例 |
---|---|---|---|
oid | 全て | 数値オブジェクト識別子 | 564182 |
regproc | pg_proc | 関数名 | sum |
regprocedure | pg_proc | 引数の型を持つ関数 | sum(int4) |
regoper | pg_operator | 演算子名 | + |
regoperator | pg_operator | 引数の型を持つ演算子 | *(integer,integer) or -(NONE,integer) |
regclass | pg_class | リレーション名 | pg_type |
regtype | pg_type | データ型名 | integer |
regconfig | pg_ts_config | テキスト検索設定 | english |
regdictionary | pg_ts_dict | テキスト検索辞書 | simple |
全てのOID別名型はスキーマ修飾名を受け入れ、出力時にスキーマ修飾名を表示します。 ただし、現在の検索パスでオブジェクトが見つけられなければ、修飾せずに出力します。 regprocとregoper別名型は、一意な(オーバーロードしていない)名前のみを入力として受け入れるため、これらの使用には限度があります。 ほとんどの場合、regprocedureまたはregoperatorを使用するのが適切です。 regoperatorの場合、単項演算子は未使用のオペランドをNONEと記述することによって指定されます。
OID別名型の更なる属性として、これらの型の1つの定数が格納された式内に存在する場合(列のデフォルト式やビューなど)、参照されるオブジェクトへの依存性を生成します。 例えば、列がnextval('my_seq'::regclass)というデフォルト式を持つ場合、PostgreSQLはデフォルト式がmy_seqシーケンスに依存することを理解します。 システムは先にこのデフォルト式が削除されない限り、このシーケンスを削除させません。
システムが使用するもう1つの識別子の型はxid、すなわちトランザクション(略してxact)識別子です。 これはxminシステム列およびxmaxシステム列のデータ型です。 トランザクション識別子は32ビット長です。
システムが使用する3つ目の識別子はcid、すなわちコマンド識別子です。 これはcminシステム列およびcmaxシステム列のデータ型です。 コマンド識別子も 32 ビット長です。
システムが使用する最後の識別子はtid、すなわちタプル識別子(行識別子)です。 これはctidシステム列のデータ型です。 タプルIDはテーブル内の行の物理的位置を識別するための組(ブロック番号、ブロック内のタプルインデックス)です。
(システム列の詳細は項5.4で説明します。)