【问题标题】:Postgresql Columns information from schema including descriptions来自模式的 Postgresql 列信息,包括描述
【发布时间】:2016-11-05 05:31:51
【问题描述】:

我需要从一个数据库中的所有表中连接一些列信息,我找到了这个选择

SELECT 'postgresql' AS dbms,
        t.table_catalog,t.table_schema,
        t.table_name,c.column_name,
        c.ordinal_position,c.data_type,
        c.character_maximum_length,
        n.constraint_type,
        k2.table_schema,
        k2.table_name,
        k2.column_name

FROM information_schema.tables t 
    NATURAL LEFT JOIN information_schema.columns c 
        LEFT JOIN(
            information_schema.key_column_usage k 
                NATURAL JOIN information_schema.table_constraints n 
                NATURAL LEFT JOIN information_schema.referential_constraints r) 
        ON c.table_catalog=k.table_catalog 
        AND c.table_schema=k.table_schema 
        AND c.table_name=k.table_name 
        AND c.column_name=k.column_name 
    LEFT JOIN information_schema.key_column_usage k2 
        ON k.position_in_unique_constraint=k2.ordinal_position 
        AND r.unique_constraint_catalog=k2.constraint_catalog 
        AND r.unique_constraint_schema=k2.constraint_schema 
        AND r.unique_constraint_name=k2.constraint_name 
WHERE t.TABLE_TYPE='BASE TABLE' AND t.table_schema NOT IN('information_schema','pg_catalog')
ORDER BY t.table_name;

这个查询提供了很多信息,但我需要所有列名的描述。

我找到了显示描述的另一个查询

SELECT *

FROM pg_catalog.pg_statio_all_tables as st
        inner join pg_catalog.pg_description pgd on (pgd.objoid=st.relid)
        inner join information_schema.columns c on (pgd.objsubid=c.ordinal_position
                and  c.table_schema=st.schemaname and c.table_name=st.relname);

问题是如何将第二个查询中的字段 pgd.description 插入到第一个查询中。

感谢和问候 库罗

【问题讨论】:

    标签: database postgresql schema


    【解决方案1】:

    它们是两组不同的元数据函数:第一组使用通用 information_schema,而第二组使用 PostgreSQL 的特定系统函数。可以通过从 information_schema 表中获取模式和表名的对象 id (oid) 来连接它们:

    SELECT 'postgresql' AS dbms,
            t.table_catalog,t.table_schema,
            t.table_name,c.column_name,
            c.ordinal_position,c.data_type,
            c.character_maximum_length,
            n.constraint_type,
            k2.table_schema,
            k2.table_name,
            k2.column_name,
            td.description AS table_description,
            cd.description AS column_description
    FROM information_schema.tables t
        LEFT JOIN pg_catalog.pg_description td
            ON (td.objoid = (quote_ident(t.table_schema)||'.'||quote_ident(t.table_name))::regclass AND td.objsubid = 0)
        NATURAL LEFT JOIN information_schema.columns c 
            LEFT JOIN(
                information_schema.key_column_usage k 
                    NATURAL JOIN information_schema.table_constraints n 
                    NATURAL LEFT JOIN information_schema.referential_constraints r) 
            ON c.table_catalog=k.table_catalog 
            AND c.table_schema=k.table_schema 
            AND c.table_name=k.table_name 
            AND c.column_name=k.column_name 
        LEFT JOIN information_schema.key_column_usage k2 
            ON k.position_in_unique_constraint=k2.ordinal_position 
            AND r.unique_constraint_catalog=k2.constraint_catalog 
            AND r.unique_constraint_schema=k2.constraint_schema 
            AND r.unique_constraint_name=k2.constraint_name 
        LEFT JOIN pg_catalog.pg_description cd
            ON (cd.objoid = (quote_ident(t.table_schema)||'.'||quote_ident(t.table_name))::regclass AND cd.objsubid = c.ordinal_position)
    WHERE t.TABLE_TYPE='BASE TABLE' AND t.table_schema NOT IN('information_schema','pg_catalog')
    ORDER BY t.table_name;
    

    【讨论】:

      猜你喜欢
      • 2016-01-10
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      相关资源
      最近更新 更多