2011-10-07 47 views
9

继承在PostgreSQL为这些表检查表与其他表中的PostgreSQL

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

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

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

对于cities_capitals应该是true,对城市应该是false

回答

10

有一个目录表:pg_inherits

该目录pg_inherits记录有关表继承 层次结构的信息。 数据库中的每个直接子表都有一个条目。从别的地方FALSE

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

TRUE如果表cities_capitals继承,:(间接的继承可以通过以下链条目 确定)。

这里是一个适合您的问题的查询。
模式 - 限定名称以确保。

+0

我应该如何将inhrelid与模式中的表名相关联? –

+0

@AxelFontaine:我添加到我的答案。其实很简单 - 一旦你知道它。 ;) –

3

以下语句将检索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 
0

PostgreSQL的车博士我发现这个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) 

这是有帮助的,你可以在两个方向上测试一个查询。