Получить информацию об индексе в PostgreSQL 8.4

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

  • индекс
  • столбцы, которые индексируются
  • уникальный или нет?

Как я могу сделать это в 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 ответ

Решение

Вы можете просто использовать 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

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

Другие вопросы по тегам