2011-10-07 3 views
9

Dans PostgreSQL pour ces tablesVérifiez si la table hérite d'une autre table PostgreSQL

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

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

Comment puis-je vérifier programme si l'une de ces tables hérite d'une autre table ou non? (Pensez information_schema, pg_catalog, ...)

Devrait être true pour cities_capitals et false pour les villes.

Répondre

10

Il existe une table de catalogue pour cela: pg_inherits.

Le catalogue pg_inherits enregistre des informations sur l'héritage de table hiérarchies. Il existe une entrée pour chaque table enfant directe dans la base de données . (Héritage indirect peut être déterminé par les chaînes suivantes des entrées.)

Voici une requête qui correspond à votre question:

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

TRUE si la table cities_capitals hérite de quelque part, d'autre FALSE.
Schéma-qualifier le nom pour être sûr.

+0

Comment est-ce que je devrais corréler l'inhrelid avec un nom de table dans un schéma? –

+0

@AxelFontaine: J'ai ajouté à ma réponse. C'est en fait assez simple - une fois que vous le savez. ;) –

3

L'instruction suivante récupérera les tables dont cities hérite. Si la table ne hérite pas d'une autre table, le résultat sera vide:

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

De AutoDoc Postgresql J'ai trouvé ce 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) 

Ceci est utile que vous pouvez tester dans les deux sens avec une requête.