無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

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

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

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

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


powered by SEO.CUG.NET