获取表的所有分区名称

Vis*_*mar 17 postgresql partitioning

我想列出 PostgreSQL 9.1 中由动态触发器创建的所有分区。
我能够使用Frank Heikens 的这个相关答案生成分区计数。

我有一个表foo有一个INSERT触发器创建foo_1foo_2等动态。插入的分区是根据主键 id 选择的,这是一种基于范围的分区。

是否可以显示 table 的当前所有分区foo

dez*_*zso 25

使用您链接的答案中的第一个查询并添加一个简单的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';
Run Code Online (Sandbox Code Playgroud)


Erw*_*ter 13

使用对象标识符类型regclass进行非常简单的查询:

SELECT inhrelid::regclass AS child -- optionally cast to text
FROM   pg_catalog.pg_inherits
WHERE  inhparent = 'my_schema.foo'::regclass;
Run Code Online (Sandbox Code Playgroud)

列出给定父表的所有子表parent_schema.foo。模式限定是可选的,search_path如果缺少则决定可见性。

同样,返回的表名是模式限定的,并在必要时自动转义。安全、快速、简单。

该解决方案也适用于 Postgres 10 或更高版本中的声明式分区,因为引用手册:

单个分区通过幕后继承链接到分区表;

此外,要显示从任何表中检索到的任何行的源表:

SELECT tableoid::regclass AS source, *
FROM   my_schema.foo
WHERE  <some_condition>;
Run Code Online (Sandbox Code Playgroud)