web-dev-qa-db-ja.com

Postgresqlでregclassが意味するもの

CREATE TABLEステートメントに次の行があります。

field1_id bigint DEFAULT nextval('table1_field1_id_seq'::regclass) NOT NULL,

上記でregclassは何を意味しますか? ::regclassを追加することは絶対要件ですか?

NB:Postgresqlのドキュメントを見ました linkregclassについて説明していますが、理解できませんでした。

38
saji89

いいえ、regclassから暗黙的なキャストがあるため、nextvalパラメーターを受け入れるregclassなどの関数を呼び出す場合、textへのキャストは必要ありません。 regclassに。他のコンテキストでは、regclassへの明示的なキャストが必要な場合があります。

説明:

::regclassは、::integerのようなキャストです。

regclassは「マジック」データ型です。実際にはoidのエイリアス、または「オブジェクト識別子」です。ドキュメントの Object identifier types を参照してください。 regclassへのキャストは、「これはリレーションの名前です。そのリレーションのOIDに変換してください」と言う簡単な方法です。リレーションのregclassを直接照会するsearch_pathとは異なり、oidへのキャストはpg_classを認識しているため、regclassへのキャストはpg_classのサブクエリとまったく同じではありません。

テーブルは関係です。シーケンスとビューも同様です。したがって、regclassにキャストすることで、ビューまたはシーケンスのoidを取得できます。

textからregclassへの暗黙的なキャストが定義されているため、明示的なキャストを省略し、regclassを受け入れる関数を呼び出す場合、キャストは自動的に行われます。したがって、たとえばnextval呼び出しでnotは必要ありません。

他の場所もあります。たとえば、textoidを直接比較することはできません。あなたはこれを行うことができます:

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に表示されるスキーマの順序で残りの関係のリストをソートします
  • そして最初の試合を選ぶ
53
Craig Ringer

私がドキュメントについて理解していることから、oidはタイプに細分化されています。 regclassは、リレーションを表すデータベースオブジェクトです(したがって、メタデータテーブルpg_classに属します)。

シーケンスとDEFAULT式の間の依存関係を表します(たとえば、INSERTクエリで明示的な値が指定されていない場合、デフォルト値を生成するプロセスを意味します)。したがって、DROP SEQUENCE ...シーケンス上では、(DROP SEQUENCE table1_field1_id_seq CASCADEと記述することにより)カスケードされない限り、クエリは渡されません。

0
didierc