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

hec6srdp  于 2022-12-23  发布在  PostgreSQL
关注(0)|答案(4)|浏览(265)

在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 ......)
城市_首都应为true,城市应为false

igetnqfo

igetnqfo1#

这里有一个目录表:pg_inherits.
目录pg_inherits记录了表继承层次结构的信息。数据库中的每个直接子表都有一个条目。(间接继承可以通过下面的条目链来确定。)
下面是一个符合您的问题的查询:

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

TRUE如果表cities_capitals从某处继承,则为FALSE
对名称进行模式限定以确保安全。

wmtdaxz3

wmtdaxz32#

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

a0x5cqrl3#

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)

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

odopli94

odopli944#

另一种方法是使用INHERITS

SELECT INHERITS(
  (SELECT oid FROM pg_class WHERE relname = 'cities_capitals'),
  (SELECT oid FROM pg_class WHERE relname = 'cities')
)

如果cities_capitals继承自cities,则返回t,否则返回f

相关问题