在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
。
答案 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)
这很有用,因为您可以使用一个查询在两个方向上进行测试。