Получить информацию об индексе в PostgreSQL 8.4 - PullRequest
0 голосов
/ 22 ноября 2011

Мне нужно получить следующую информацию об индексах для конкретной таблицы:

  • имя индекса
  • столбцы, которые проиндексированы
  • уникален или нет?

Как я могу это сделать в PostgreSQL 8.4?

ПРИМЕЧАНИЕ : я должен иметь возможность вызывать это с помощью PHP. Просто говорю ...

РЕДАКТИРОВАТЬ : у меня сначала был этот запрос, но он работает только начиная с PostgreSQL 9.0:

SELECT t.relname AS table_name,
relname AS index_name,
a.attname AS column_name,
ix.indisunique
FROM pg_class t,
pg_class i,
pg_index ix,
pg_attribute a,
pg_constraint c
WHERE t.oid = ix.indrelid
  AND i.oid = ix.indexrelid
  AND a.attrelid = t.oid
  AND i.oid = c.conindid
  AND a.attnum = ANY(ix.indkey)
  AND c.contype != 'p'
  AND t.relkind = 'r'
  AND t.relname = 'tablename'
ORDER BY t.relname, i.relname

1 Ответ

2 голосов
/ 22 ноября 2011

Вы можете просто использовать pg_indexes , который будет включать в себя полный оператор CREATE TABLE (а также информацию о столбцах и уникальности).

В качестве альтернативы должно работать следующее:

select t.relname as table_name,
       ix.relname as index_name,
       array_to_string(array_agg(col.attname), ',') as index_columns,
       i.indisunique
from pg_index i
  join pg_class ix on ix.oid = i.indexrelid
  join pg_class t on t.oid = i.indrelid
  join (select ic.indexrelid, 
               unnest(ic.indkey) as colnum
        from pg_index ic) icols on icols.indexrelid = i.indexrelid
  join pg_attribute col on col.attrelid = t.oid and col.attnum = icols.colnum
where t.relname = 'tablename'
group by t.relname, ix.relname, i.indisunique
order by t.relname,
         ix.relname

Это не возвращает столбцы в правильном порядке. Но у меня не было времени углубиться в это.

...