Получить информацию об индексе в 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
Однако он не возвращает столбцы в правильном порядке. Но у меня не было времени углубиться в это.