pgsql 查询所有表的主键和备注

该SQL查询从pg_constraint、pg_class、pg_attribute、pg_type和pg_stat_all_tables表中获取公共模式(public)中的主键详细信息,包括主键名称(pk_name)、列名(colname)、数据类型(typename)、模式名(schemaname)、表名(table)以及表的注释(comment)。查询条件是约束类型(contype)为主键(p)。

SELECT
    pg_constraint.conname AS pk_name,
    pg_attribute.attname AS colname,
    pg_type.typname AS typename,
    pg_stat_all_tables.schemaname as "schemaname",
    pg_stat_all_tables.relname as "table",
    cast(obj_description(relfilenode,'pg_class') as varchar) as comment
FROM
    pg_constraint 
    INNER JOIN pg_class  ON pg_constraint.conrelid = pg_class.OID 
    INNER JOIN pg_attribute ON pg_attribute.attrelid = pg_class.OID  AND pg_attribute.attnum = pg_constraint.conkey [ 1 ]
    INNER JOIN pg_type ON pg_type.OID = pg_attribute.atttypid 
    INNER JOIN pg_stat_all_tables ON pg_stat_all_tables.relid = pg_class.OID
WHERE
    pg_stat_all_tables.schemaname = 'public' 
    AND pg_constraint.contype = 'p';

### 如何在 PostgreSQL查询表主键PostgreSQL 数据库中,可以通过系统目录 `pg_constraint` 其他相关视图来查询某个主键信息。以下是实现这一目标的具体方法。 #### 查询单个主键 如果需要查询特定主键列名称及其相关信息,可以使用如下 SQL 语句: ```sql SELECT conname AS constraint_name, string_agg(attname, ', ') AS primary_key_columns FROM pg_attribute a JOIN pg_constraint c ON a.attrelid = c.conrelid AND a.attnum = ANY(c.conkey) WHERE c.contype = 'p' -- 主键约束类型 AND a.attrelid = '名'::regclass GROUP BY conname; ``` 此查询通过连接 `pg_attribute` `pg_constraint` ,筛选出指定中的主键列,并将其以逗号分隔的形式返回[^1]。 --- #### 批量查询数据库中所有主键 为了批量获取整个数据库中所有主键信息,可以扩展上述查询逻辑,去掉针对具体的过滤条件: ```sql SELECT n.nspname AS schema_name, c.relname AS table_name, con.conname AS constraint_name, string_agg(a.attname, ', ') AS primary_key_columns FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_constraint con ON c.oid = con.conrelid JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(con.conkey) WHERE con.contype = 'p' GROUP BY n.nspname, c.relname, con.conname; ``` 该查询会遍历当前数据库下的所有模式 (`schema`) 及其对应,提取每张主键列并汇总显示[^1]。 --- #### 处理无主键的情况 当某些未定义主键时,在查询过程中可能会遇到异常情况(如错误提示)。为了避免这种情况影响整体查询结果,可以在查询中加入额外判断逻辑,仅处理那些确实设置了主键。例如: ```sql AND EXISTS ( SELECT 1 FROM pg_constraint sub_con WHERE sub_con.conrelid = c.oid AND sub_con.contype = 'p' ); ``` 这一步骤确保只有具有主键被纳入最终的结果集中[^2]。 --- #### 获取主键的同时附加注释信息 除了主键外,有时还需要了解这些字段是否有描述性的注释。为此,可以进一步关联 `pg_description` 视图,从而补充每一列的相关说明数据: ```sql LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum ``` 随后将注释内容添加至输出列中即可完成需求[^1]。 --- ### 示例代码总结 综合以上各部分功能,完整的解决方案可能如下所示: ```sql SELECT n.nspname AS schema_name, c.relname AS table_name, con.conname AS constraint_name, string_agg(a.attname, ', ') AS primary_key_columns, obj_description(c.oid, 'pg_class') AS table_comment FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid JOIN pg_constraint con ON c.oid = con.conrelid JOIN pg_attribute a ON a.attrelid = c.oid AND a.attnum = ANY(con.conkey) LEFT JOIN pg_description d ON d.objoid = c.oid AND d.objsubid = a.attnum WHERE con.contype = 'p' GROUP BY n.nspname, c.relname, con.conname, obj_description(c.oid, 'pg_class'); ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值