Check if table inherits from other table in PostgreSQL

后端 未结 3 1753
南方客
南方客 2021-01-17 17:05

In PostgreSQL for these tables

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

CREATE T         


        
相关标签:
3条回答
  • 2021-01-17 17:24

    From Postgresql AutoDoc I found this 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)
    

    This is helpful as you can test in both directions with one query.

    0 讨论(0)
  • 2021-01-17 17:28

    There is a catalog table for that: pg_inherits.

    The catalog pg_inherits records information about table inheritance hierarchies. There is one entry for each direct child table in the database. (Indirect inheritance can be determined by following chains of entries.)

    Here's a query that fits your question:

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

    TRUE if table cities_capitals inherits from somewhere, else FALSE.
    Schema-qualify the name to be sure.

    0 讨论(0)
  • 2021-01-17 17:34

    The following statement will retrieve the tables that cities inherits from. If the table does not inherit from another table, the result will be empty:

    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 讨论(0)
提交回复
热议问题