web-dev-qa-db-ja.com

テーブルのすべてのパーティション名を取得する

PostgreSQL 9.1の動的トリガーによって作成されたすべてのパーティションを一覧表示したい。
フランクハイケンスによるこの関連回答 を使用して、パーティションの数を生成することができました。

foo_1foo_2などを動的に作成する挿入トリガーを持つテーブルfooがあります。挿入するパーティションは、範囲ベースのパーティションである主キーIDに基づいて選択されます。

テーブルfooに現在配置されているすべてのパーティションを表示することは可能ですか?

11
Vishnu Kumar

リンクした回答の最初のクエリを使用し、単純なWHERE句を追加して、単一のテーブルのパーティションを取得します。

SELECT
    nmsp_parent.nspname AS parent_schema,
    parent.relname      AS parent,
    nmsp_child.nspname  AS child_schema,
    child.relname       AS child
FROM pg_inherits
    JOIN pg_class parent            ON pg_inherits.inhparent = parent.oid
    JOIN pg_class child             ON pg_inherits.inhrelid   = child.oid
    JOIN pg_namespace nmsp_parent   ON nmsp_parent.oid  = parent.relnamespace
    JOIN pg_namespace nmsp_child    ON nmsp_child.oid   = child.relnamespace
WHERE parent.relname='parent_table_name';
18
dezso

オブジェクト識別子タイプ regclass を使用すると、これを大幅に簡略化できます。

parent_schema.fooのすべての子テーブルを一覧表示します。

SELECT i.inhrelid::regclass AS child -- optionally cast to text
FROM   pg_inherits i
WHERE  i.inhparent = 'my_schema.foo'::regclass;

regclassへのキャストに指定するテーブル名は、オプションでスキーマ修飾することができます。そうでない場合、 search_path が可視性を決定します。

同様に、返されたテーブル名はスキーマで修飾され、必要に応じて自動的にエスケープされます。
非常に安全、迅速、便利です。

ところで、 行ごとにソーステーブルを表示 任意のテーブルから取得した任意の行:

SELECT tableoid::regclass AS source, *
FROM   my_schema.foo
WHERE <some_condition>;
6