sql >> データベース >  >> RDS >> PostgreSQL

Postgresqlでregclassはどういう意味ですか

    いいえ、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に表示された順序で並べ替えます
    • 最初の一致を選択


    1. MySQLでibdata1ファイルを縮小/パージする方法

    2. クエリは、すべてを個別の行ではなく1つの行に連結します

    3. mysqlトリガーオペランドには2つの列が含まれている必要があります

    4. Symfony2-Doctrine2 QueryBuilder WHEREINManyToManyフィールド