いいえ、regclass
へのキャストは必要ありません nextval
のような関数を呼び出すとき regclass
を受け入れる text
からの暗黙のキャストがあるためパラメータ regclass
へ 。他のいくつかのコンテキストでは、regclass
への明示的なキャスト 必要になる場合があります。
説明:
::regclass
::integer
のようなキャストです 。
regclass
「魔法の」データ型です。実際にはoid
のエイリアスです 、または「オブジェクト識別子」。 オブジェクト識別子の種類
を参照してください。 ドキュメントで。 regclass
へのキャスト 「これはリレーションの名前です。そのリレーションのOIDに変換してください」という簡単な言い方です。 regclass
にキャストします search_path
を認識しています 、pg_class
のクエリとは異なり リレーションのoid
の場合 したがって、regclassにキャストすることは、pg_class
をサブクエリすることとまったく同じではありません。 。
テーブルは関係です。シーケンスやビューもそうです。したがって、regclassにもキャストすることで、ビューまたはシーケンスのOIDを取得できます。
text
に対して定義された暗黙のキャストがあります regclass
へ したがって、明示的なキャストを省略し、regclass
を受け入れる関数を呼び出している場合 キャストは自動的に行われます。だからあなたはしない たとえば、nextval
で必要です 呼び出します。
あなたがそうするかもしれない他の場所があります。たとえば、text
を比較することはできません oid
で直接;だからあなたはこれを行うことができます:
regress=> select * from pg_class where oid = 'table1'::regclass;
しかしこれではありません:
regress=> select * from pg_class where oid = 'table1';
ERROR: invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';
楽しみのために、regclass
にキャストするのと同等の操作を実行するクエリを作成しようとしました。 。それを使用しないでください、それは主に楽しみのためであり、実際に起こっていることをデモする試みとしてです。 Pgの内臓がどのように機能するかに本当に興味がない限り、ここで読むのをやめることができます。
私が理解しているように、'sequence_name'::regclass::oid
次のクエリとほぼ同等です:
WITH sp(sp_ord, sp_schema) AS (
SELECT
generate_series(1, array_length(current_schemas('t'),1)),
unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;
それがはるかに短く、はるかに速いことを除いて。 システム情報関数
を参照してください。 current_schemas(...)
の定義について 、など。
言い換えれば:
- アクセスできるすべてのスキーマを一覧表示するab配列を取得し、各エントリを配列内の位置の序数とペアにします
- 検索
pg_class
一致する名前との関係の場合、それぞれをその名前空間(スキーマ)に関連付けます - 残りのリレーションのリストを、スキーマが
search_path
に表示された順序で並べ替えます - 最初の一致を選択