2011-10-07 21 views
9

En PostgreSQL para estas tablasComprobar si la tabla hereda de otra tabla en PostgreSQL

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

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

¿Cómo puedo comprobar mediante programación si una de estas tablas hereda de otra tabla o no? (Piense en information_schema, pg_catalog, ...)

Debe ser true para cities_capitals y false para las ciudades.

Respuesta

10

Hay una tabla de catálogo para eso: pg_inherits.

La información del catálogo pg_inherits registros sobre la herencia de tablas jerarquías. Hay una entrada para cada tabla secundaria directa en la base de datos . (Herencia indirecta puede ser determinada siguiendo cadenas de entradas.)

Aquí es una consulta que se adapte a su pregunta:

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

TRUE si la tabla cities_capitals hereda de alguna parte, de lo contrario FALSE.
Esquema: califica el nombre para estar seguro.

+0

¿Cómo debo correlacionar el inhrelid con el nombre de una tabla en un esquema? –

+0

@AxelFontaine: Agregué mi respuesta. En realidad es bastante simple, una vez que lo sabes. ;) –

3

La siguiente instrucción recuperará las tablas heredadas de cities. Si la tabla no hereda de otra tabla, el resultado estará vacío:

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 me encontré con este 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) 

Esto es útil como se puede comprobar en ambas direcciones con una consulta

Cuestiones relacionadas