检查表是否继承PostgreSQL中的其他表

时间:2011-10-07 16:47:27

标签: sql database postgresql inheritance

在PostgreSQL中为这些表

CREATE TABLE cities (
    name            text,
    population      float,
    altitude        int     -- in feet
);

CREATE TABLE cities_capitals (
    state           char(2)
) INHERITS (cities);

我如何以编程方式检查这些表中的一个是否继承自另一个表? (想想information_schema,pg_catalog,......)

对于cities_capitals应为true,对于城市应为false

3 个答案:

答案 0 :(得分:13)

有一个目录表:pg_inherits

  

目录pg_inherits记录有关表继承的信息   层次结构。每个直接子表中都有一个条目   数据库。 (间接继承可以通过以下链来确定   条目。)

以下是符合您问题的查询:

SELECT EXISTS (
   SELECT 1
   FROM   pg_catalog.pg_inherits
   WHERE  inhrelid = 'public.cities_capitals'::regclass
   );

TRUE如果表cities_capitals从某个地方继承,则为FALSE Schema-确定名称以确定。

答案 1 :(得分:4)

以下语句将检索cities继承的表。如果表没有从另一个表继承,则结果将为空:

select bt.relname as table_name, bns.nspname as table_schema 
from pg_class ct 
    join pg_namespace cns on ct.relnamespace = cns.oid and cns.nspname = 'public' 
    join pg_inherits i on i.inhrelid = ct.oid and ct.relname = 'cities ' 
    join pg_class bt on i.inhparent = bt.oid 
    join pg_namespace bns on bt.relnamespace = bns.oid

答案 2 :(得分:0)

Postgresql AutoDoc 我发现了这个SQL:

SELECT parnsp.nspname AS par_schemaname
    , parcla.relname AS par_tablename
    , chlnsp.nspname AS chl_schemaname
    , chlcla.relname AS chl_tablename
 FROM pg_catalog.pg_inherits
 JOIN pg_catalog.pg_class AS chlcla ON (chlcla.oid = inhrelid)
 JOIN pg_catalog.pg_namespace AS chlnsp ON (chlnsp.oid = chlcla.relnamespace)
 JOIN pg_catalog.pg_class AS parcla ON (parcla.oid = inhparent)
 JOIN pg_catalog.pg_namespace AS parnsp ON (parnsp.oid = parcla.relnamespace)

这很有用,因为您可以使用一个查询在两个方向上进行测试。