Проверьте, наследуется ли таблица от другой таблицы в PostgreSQL - PullRequest
10 голосов
/ 07 октября 2011

В PostgreSQL для этих таблиц

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

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

Как мне программно проверить , наследует ли одна из этих таблиц другую таблицу или нет? (Вспомните информационную схему, pg_catalog, ...)

Должно быть true для города_ столицы и false для города.

Ответы [ 3 ]

13 голосов
/ 07 октября 2011

Для этого есть таблица каталогов: pg_inherits.

В каталоге pg_inherits записывается информация о наследовании таблиц. Иерархии. Существует одна запись для каждой прямой дочерней таблицы в база данных. (Косвенное наследование может быть определено следующими цепочками записей.)

Вот запрос, который соответствует вашему вопросу:

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

TRUE если таблица cities_capitals наследуется откуда-то, иначе FALSE.
Схема-уточните имя, чтобы быть уверенным.

4 голосов
/ 07 октября 2011

Следующий оператор извлечет таблицы, от которых наследуется 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 голосов
/ 24 августа 2014

С 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)

Это полезно, поскольку вы можете тестировать в обоих направлениях одним запросом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...