List columns with indexes in PostgreSQL

后端 未结 23 1944
我在风中等你
我在风中等你 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:57

    Create some test data...

    create table test (a int, b int, c int, constraint pk_test primary key(a, b));
    create table test2 (a int, b int, c int, constraint uk_test2 unique (b, c));
    create table test3 (a int, b int, c int, constraint uk_test3b unique (b), constraint uk_test3c unique (c),constraint uk_test3ab unique (a, b));
    

    List indexes and columns indexed:

    select
        t.relname as table_name,
        i.relname as index_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 'test%'
    order by
        t.relname,
        i.relname;
    
     table_name | index_name | column_name
    ------------+------------+-------------
     test       | pk_test    | a
     test       | pk_test    | b
     test2      | uk_test2   | b
     test2      | uk_test2   | c
     test3      | uk_test3ab | a
     test3      | uk_test3ab | b
     test3      | uk_test3b  | b
     test3      | uk_test3c  | c
    

    Roll up the column names:

    select
        t.relname as table_name,
        i.relname as index_name,
        array_to_string(array_agg(a.attname), ', ') as column_names
    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 'test%'
    group by
        t.relname,
        i.relname
    order by
        t.relname,
        i.relname;
    
     table_name | index_name | column_names
    ------------+------------+--------------
     test       | pk_test    | a, b
     test2      | uk_test2   | b, c
     test3      | uk_test3ab | a, b
     test3      | uk_test3b  | b
     test3      | uk_test3c  | c
    

提交回复
热议问题