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

PostgreSQL 8.4.1文書
前のページ | 巻戻し | 第 8章データ型 | 早送り | 次のページ

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

オブジェクト識別子（OID）はPostgreSQLの内部で様々なシステムテーブルのプライマリキーとして使用されます。 また、テーブル作成時に`WITH OIDS`が指定されているか、default_with_oids設定変数が有効な場合を除き、ユーザ作成のテーブルにはOIDは追加されません。 `oid`データ型はオブジェクト識別子を表します。 `oid`には別名型もいくつかあります。 `regproc`、`regprocedure`、`regoper`、`regoperator`、`regclass`、`regtype`、`regconfig`、および`regdictionary`です。 表8-22に概要を示します。

`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-22. オブジェクト識別子データ型

型名 | 参照 | 説明 | 値の例
--- | --- | --- | ---
`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で説明します。）

前のページ | ホーム | 次のページ
複合型 | 上に戻る | 疑似データ型