2011-10-07 9 views
9

इन तालिकाओं के लिए PostgreSQL मेंजांचें कि क्या PostgreSQL में तालिका को अन्य तालिका से विरासत में मिला है

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

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

मैं प्रोग्रामेटिक रूप से कैसे जांच सकता हूं कि इनमें से एक टेबल किसी अन्य तालिका से प्राप्त होता है या नहीं? (Info_schema, pg_catalog, ... सोचें)

शहरों के लिए true होना चाहिए_ शहरों के लिए false और false

उत्तर

10

इसके लिए एक कैटलॉग तालिका है: pg_inherits

तालिका विरासत पदानुक्रम के बारे में सूची pg_inherits रिकॉर्ड जानकारी। डेटाबेस में प्रत्येक प्रत्यक्ष बाल तालिका के लिए एक प्रविष्टि है। बाकी FALSE कहीं से

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

TRUE यदि तालिका cities_capitals इनहेरिट करती है,: (अप्रत्यक्ष विरासत चेन प्रविष्टियों की का पालन करते हुए निर्धारित किया जा सकता।)

यहाँ एक प्रश्न है कि आपके प्रश्न के लिए फिट है।
स्कीमा सुनिश्चित करने के लिए नाम को अर्हता प्राप्त करें।

+0

स्कीमा में तालिका नाम के साथ इनहेरल को कैसे सहसंबंधित करना चाहिए? –

+0

@ एक्सेलफ़ोन्टेन: मैंने अपने उत्तर में जोड़ा। यह वास्तव में काफी सरल है - एक बार जब आप इसे जानते हैं। ;) –

3

निम्न कथन उन तालिकाओं को पुनर्प्राप्त करेगा जो 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

Postgresql AutoDoc से मैं इस एसक्यूएल पाया:

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) 

यह उपयोगी है के रूप में आप दोनों दिशाओं में परीक्षण कर सकते हैं एक प्रश्न के साथ।

संबंधित मुद्दे