0

我需要获取有关特定表上的索引的以下信息:

  • 索引名称
  • 被索引的列
  • 独特与否?

我怎样才能在 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
4

1 回答 1

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

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

于 2011-11-22T12:49:30.830 回答