【问题标题】:postgresql: how list indexed columns?postgresql:如何列出索引列?
【发布时间】:2011-07-19 06:41:57
【问题描述】:

有很多信息,可以从postgresql 中的information_schema 和pg_catalog 中检索到。我想检索有关由某个索引索引的列的信息,类似于我在 sqlite3 中使用pragma index_info(<index_name>) 实现的功能。不解析create index语句如何实现?

【问题讨论】:

  • @OMG Ponies:因为答案并不像听起来那么简单。

标签: postgresql indexing information-schema


【解决方案1】:

接受的答案对我不起作用(执行时发生错误)。

无论如何,您可以列出数据库中的所有列,并以某种方式标记所有索引列 (限制结果行集的能力被称为 cmets):

    WITH 
    table_select as (
        select row_number() over(ORDER BY relname) as rownum, 
        c.relname, c.oid, c.reltuples
        FROM pg_class c
        JOIN pg_namespace n ON (n.oid = c.relnamespace)
        WHERE  c.relkind = 'r'::"char" 
               --AND n.nspname = '%MyNameSpaceHere%'
        ORDER BY c.relname      
    ),
    indxs as (
    select distinct t.relname as table_name, a.attname as column_name
    from pg_class t,  pg_class i, pg_index ix, pg_attribute a
    where
        t.oid = ix.indrelid
        and i.oid = ix.indexrelid
        and a.attrelid = t.oid
        and a.attnum = ANY(ix.indkey)
        and t.relkind = 'r'
        --and t.relname like 'mytable here'
        and cast (i.oid::regclass as text) like '%MyNameSpaceHere%'
    order by
        t.relname --, i.relname
    ),
    cols as (
    select a.attname, a.attrelid, c.oid, col.TABLE_NAME, col.COLUMN_NAME 
       FROM table_select c
        JOIN pg_attribute a ON (a.attrelid = c.oid) AND  (a.attname <> 'tableoid')
        LEFT JOIN information_schema.columns col ON 
(col.TABLE_NAME = c.relname AND col.COLUMN_NAME = a.attname )
      WHERE    
          ( a.attnum >= 0 ) --attnum > 0 for real columns
    )

    --select * from table_select t
    select c.TABLE_NAME, c.COLUMN_NAME, 
        case when i.column_name is not null then 'Y' else '' end as is_indexed 
    from cols c
    left join indxs i on (i.table_name = c.table_name and i.column_name = c.column_name)

示例结果:

    table_name column_name is_indexed
   'events        id          "Y"
    events       type         "Y"
    events       descr         ""   '

【讨论】:

    【解决方案2】:

    这些事情很容易找到。

    只需使用 -E 选项运行 psql,它就会显示所使用的 SQL 语句。因此,在运行 \d index_name 时,会使用以下语句(以及其他语句)来检索索引列:

    选择一个.attname, pg_catalog.format_type (a.atttypid,a.atttypmod), (SELECT SUBSTRING(pg_catalog.pg_get_expr(d.adbin,d.adrelid)FOR 128) FROM pg_catalog.pg_attrdef d WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum 和 a.atthasdef)a.attnotnull, a.attnum, pg_catalog.pg_get_indexdef (a.attrelid,a.attnum,TRUE) AS indexdef FROM pg_catalog.pg_attribute 一个 WHERE a.attrelid = (SELECT oid FROM pg_class WHERE relname = 'index_name') AND a.attnum > 0 而不是 a.attisdropped 由 a.attnum 订购;

    【讨论】:

    • 我不知道,您可以使用\d 显示索引信息。这非常有用,还有“-E”选项。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2011-01-13
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-30
    • 2022-10-08
    相关资源
    最近更新 更多