【问题标题】:How do I get table attributes (PostgreSQL 12+) with a description?如何获取带有描述的表属性(PostgreSQL 12+)?
【发布时间】:2023-03-11 01:10:02
【问题描述】:

我想获取相关对象的属性:模式、表、名称、类型、PK、notnull、唯一、索引、约束、序列。 如果多个索引、约束或序列与它们相关联,我的查询会重复属性... 我该如何避免这种情况? 同时,我希望索引、约束和序列都是数组...

CREATE OR REPLACE VIEW public.my_attributes
AS SELECT
    ns.nspname AS "schema",
    ct.oid AS "tablerelid",
    ct.relname AS "tablename",
    a.attrelid AS "relid",
    a.attname AS "name",
    a.attnum AS "num",
    ( a.atttypid::regtype ) AS "type",
    a.atttypmod AS "typemod",
    ( CASE WHEN ( a.atttypid::regtype )::text = 'geometry' THEN postgis_typmod_type(a.atttypmod) END ) AS "typegeom",
    ( CASE WHEN ( a.atttypid::regtype )::text = 'geometry' THEN postgis_typmod_srid(a.atttypmod) END ) AS "typesrid",
    ia.indisprimary AS "pk",
    a.attnotnull AS "notnull",
    ia.indisunique AS "unique",
    ci.relname AS "index",
    cr.conname AS "constraint",
    pg_get_serial_sequence(quote_ident(ct.relname), quote_ident(a.attname)) AS "sequence"
FROM
    pg_attribute a
    LEFT JOIN pg_class ct ON ct.oid = a.attrelid
    LEFT JOIN pg_namespace ns ON ns.oid = ct.relnamespace
    LEFT JOIN pg_tablespace ts ON ts.oid = ct.reltablespace
    LEFT JOIN pg_index ia ON ia.indrelid = a.attrelid AND a.attnum = ANY(ia.indkey)
    LEFT JOIN pg_class ci ON ci.oid = ia.indexrelid
    LEFT JOIN pg_constraint cr ON cr.conrelid = a.attrelid AND cr.conkey @> ARRAY[a.attnum]
WHERE
    ns.nspname != 'information_schema'
    AND ns.nspname != 'pg_catalog'
    AND ns.nspname != 'tiger'
    AND ns.nspname != 'tiger_date'
    AND ns.nspname != 'topology'
    AND ct.relname != 'pointcloud_formats'
    AND ct.relname != 'spatial_ref_sys'
    AND ct.relname NOT LIKE 'pg_temp_%'
    AND ct.relkind = ANY( ARRAY['r'::"char", 'p'::"char"] )
    AND a.attnum > 0
    AND NOT a.attisdropped
ORDER BY
    lower(ns.nspname),
    lower(ct.relname),
    a.attnum;

【问题讨论】:

    标签: sql postgresql attributes postgis


    【解决方案1】:

    您可以添加一个 GROUP BY 子句,其中包含 all 唯一的列,例如 a.attnumct.relname。对于其他列,请使用 string_aggarray_agg 之类的聚合函数。

    我不能说获得unique{f,t,f} 的行有多大用处,但是如果您想以不同的形式显示信息,则必须更改查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-19
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多