2011-03-20 21 views
5

वहां बहुत सारी जानकारी है, जिसे info_schema और pg_catalog से postgresql में पुनर्प्राप्त किया जा सकता है। मैं एक निश्चित इंडेक्स द्वारा अनुक्रमित कॉलम के बारे में जानकारी पुनर्प्राप्त करना चाहता हूं, जैसा कि मैं pragma index_info(<index_name>) के साथ sqlite3 में प्राप्त करूंगा। create index कथन के बिना इसे कैसे प्राप्त किया जा सकता है?postgresql: अनुक्रमित कॉलम कैसे सूचीबद्ध करें?

+0

@OMG टट्टू: क्योंकि उत्तर उतना आसान नहीं है जितना लगता है। – intgr

उत्तर

7

उन चीज़ों को ढूंढना बहुत आसान है।

बस -E विकल्प के साथ psql चलाएं और यह आपको उपयोग किए गए SQL कथन दिखाएगा। तो जब \ घ INDEX_NAME निम्न कथन (दूसरों के बीच) चल रहा सूचकांक कॉलम पुनः प्राप्त करने के लिए किया जाता है:

 
SELECT a.attname, 
     pg_catalog.format_type (a.atttypid,a.atttypmod), 
     (SELECT SUBSTRING (pg_catalog.pg_get_expr (d.adbin,d.adrelid) FOR 128) 
     FROM pg_catalog.pg_attrdef d 
     WHERE d.adrelid = a.attrelid 
     AND d.adnum = a.attnum 
     AND a.atthasdef)a.attnotnull, 
     a.attnum, 
     pg_catalog.pg_get_indexdef (a.attrelid,a.attnum,TRUE) AS indexdef 
FROM pg_catalog.pg_attribute a 
WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = 'index_name') 
AND a.attnum > 0 
AND NOT a.attisdropped 
ORDER BY a.attnum; 
+0

मुझे नहीं पता था कि आप '\ d' के साथ एक इंडेक्स जानकारी प्रदर्शित कर सकते हैं। यह बहुत उपयोगी है, साथ ही '-E' विकल्प भी है। बहुत बहुत धन्यवाद। – gruszczy

0

स्वीकृत जवाब मेरे लिए काम नहीं किया (त्रुटि निष्पादन पर हुई)।

वैसे भी, आप डेटाबेस में सभी स्तंभों की सूची और किसी तरह से कॉलम में सभी अनुक्रमित निशान (क्षमताओं परिणाम rowset सीमित करने के लिए टिप्पणी के रूप में उल्लेख किया गया है) कर सकते हैं:

WITH 
    table_select as (
     select row_number() over(ORDER BY relname) as rownum, 
     c.relname, c.oid, c.reltuples 
     FROM pg_class c 
     JOIN pg_namespace n ON (n.oid = c.relnamespace) 
     WHERE c.relkind = 'r'::"char" 
       --AND n.nspname = '%MyNameSpaceHere%' 
     ORDER BY c.relname  
    ), 
    indxs as (
    select distinct t.relname as table_name, a.attname as column_name 
    from pg_class t, pg_class i, pg_index ix, pg_attribute a 
    where 
     t.oid = ix.indrelid 
     and i.oid = ix.indexrelid 
     and a.attrelid = t.oid 
     and a.attnum = ANY(ix.indkey) 
     and t.relkind = 'r' 
     --and t.relname like 'mytable here' 
     and cast (i.oid::regclass as text) like '%MyNameSpaceHere%' 
    order by 
     t.relname --, i.relname 
    ), 
    cols as (
    select a.attname, a.attrelid, c.oid, col.TABLE_NAME, col.COLUMN_NAME 
     FROM table_select c 
     JOIN pg_attribute a ON (a.attrelid = c.oid) AND (a.attname <> 'tableoid') 
     LEFT JOIN information_schema.columns col ON 
(col.TABLE_NAME = c.relname AND col.COLUMN_NAME = a.attname) 
     WHERE  
      (a.attnum >= 0) --attnum > 0 for real columns 
    ) 

    --select * from table_select t 
    select c.TABLE_NAME, c.COLUMN_NAME, 
     case when i.column_name is not null then 'Y' else '' end as is_indexed 
    from cols c 
    left join indxs i on (i.table_name = c.table_name and i.column_name = c.column_name) 

उदाहरण परिणाम:

table_name column_name is_indexed 
    'events  id   "Y" 
    events  type   "Y" 
    events  descr   "" ' 
संबंधित मुद्दे