List columns with indexes in PostgreSQL

后端 未结 23 1936
我在风中等你
我在风中等你 2020-11-27 09:14

I would like to get the columns that an index is on in PostgreSQL.

In MySQL you can use SHOW INDEXES FOR table and look at the Column_name

23条回答
  •  一生所求
    2020-11-27 09:56

    RESULT OF QUERY:

    table |     column     |          type          | notnull |  index_name  | is_index | primarykey | uniquekey | default
    -------+----------------+------------------------+---------+--------------+----------+-   -----------+-----------+---------
     nodes | dns_datacenter | character varying(255) | f       |              | f        | f          | f         |
     nodes | dns_name       | character varying(255) | f       | dns_name_idx | t        | f          | f         |
     nodes | id             | uuid                   | t       | nodes_pkey   | t        | t          | t         |
    (3 rows)
    

    QUERY:

    SELECT  
    c.relname AS table,
    f.attname AS column,  
    pg_catalog.format_type(f.atttypid,f.atttypmod) AS type,
    f.attnotnull AS notnull,  
    i.relname as index_name,
    CASE  
        WHEN i.oid<>0 THEN 't'  
        ELSE 'f'  
    END AS is_index,  
    CASE  
        WHEN p.contype = 'p' THEN 't'  
        ELSE 'f'  
    END AS primarykey,  
    CASE  
        WHEN p.contype = 'u' THEN 't' 
        WHEN p.contype = 'p' THEN 't' 
        ELSE 'f'
    END AS uniquekey,
    CASE
        WHEN f.atthasdef = 't' THEN d.adsrc
    END AS default  FROM pg_attribute f  
    JOIN pg_class c ON c.oid = f.attrelid  
    JOIN pg_type t ON t.oid = f.atttypid  
    LEFT JOIN pg_attrdef d ON d.adrelid = c.oid AND d.adnum = f.attnum  
    LEFT JOIN pg_namespace n ON n.oid = c.relnamespace  
    LEFT JOIN pg_constraint p ON p.conrelid = c.oid AND f.attnum = ANY (p.conkey)  
    LEFT JOIN pg_class AS g ON p.confrelid = g.oid
    LEFT JOIN pg_index AS ix ON f.attnum = ANY(ix.indkey) and c.oid = f.attrelid and c.oid = ix.indrelid 
    LEFT JOIN pg_class AS i ON ix.indexrelid = i.oid 
    
    WHERE c.relkind = 'r'::char  
    AND n.nspname = 'public'  -- Replace with Schema name 
    --AND c.relname = 'nodes'  -- Replace with table name, or Comment this for get all tables
    AND f.attnum > 0
    ORDER BY c.relname,f.attname;
    

提交回复
热议问题