2011-11-22 26 views
0

我需要获取对特定表有关指数的以下信息:取回索引信息的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 

回答

2

你可以简单地使用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 

它不以正确的顺序返回列虽然。但我没有时间深入研究。

+0

非常感谢,我会尝试并报告回来。 – Franz

+0

它似乎工作得很好(我不得不添加一个WHERE子句来获取特定表上的索引 - 也许你可以将它添加到你的答案中)。我会尝试找到列顺序的解决方案。 – Franz

+0

工作得很好。非常感谢! – Franz