Postgresql 系统表作用解释

 更新时间:2026年06月03日 09:29:57   作者:逍遥德  
这篇文章主要介绍了Postgresql 系统表作用解释,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

​postgresql 系统表有哪些,作用是什么

了解 PostgreSQL 的系统表(System Catalogs)有哪些,以及它们各自的核心作用。PostgreSQL 的系统表是存储数据库元数据(如表、字段、索引、约束、用户等信息)的核心表,所有数据库对象的定义都记录在这里,我会按功能分类梳理核心系统表,并说明它们的作用和常用场景。

一、核心系统表分类及作用

PostgreSQL 的系统表都位于 pg_catalog 模式下(可省略模式名直接查询),以下是最常用的核心表,按功能分组:

1. 数据库与模式相关

系统表名核心作用
pg_database存储数据库实例中所有数据库的信息(如数据库名、OID、所有者、编码、表空间)
pg_namespace存储数据库中的所有模式(Schema) 信息(如模式名、OID、所有者、权限)

查询示例

-- 查看所有数据库
SELECT datname, datowner, encoding FROM pg_database;

-- 查看当前数据库的所有模式
SELECT nspname, nspowner FROM pg_namespace;

2. 表 / 视图 / 索引等对象相关

系统表名核心作用
pg_class存储所有关系型对象(表、视图、索引、序列、物化视图等)的核心信息,是最核心的系统表之一
pg_attribute存储所有字段(列) 的信息(如字段名、所属表 OID、数据类型、是否可为空、默认值)
pg_type存储所有数据类型的信息(内置类型如 int/text,自定义类型都在这里)

关键说明

  • pg_class.relkind 字段区分对象类型:r= 普通表,v= 视图,i= 索引,s= 序列,m= 物化视图。
  • pg_attribute.attnum 为字段编号(>0 是普通字段,0 是表 oid,-1/-2 是系统隐藏字段)。

查询示例:

-- 查看 public 模式下的所有普通表
SELECT relname AS table_name 
FROM pg_class 
WHERE relkind = 'r' 
AND relnamespace = (SELECT oid 
            FROM pg_namespace 
            WHERE nspname = 'public');

-- 查看 users 表的所有字段及类型
SELECT 
    a.attname AS column_name,
    t.typname AS data_type,
    a.attnotnull AS is_not_null
FROM pg_attribute a
JOIN pg_type t ON a.atttypid = t.oid
WHERE a.attrelid = (SELECT oid 
            FROM pg_class WHERE relname = 'users') 
    AND a.attnum > 0;

3. 约束与索引相关

系统表名核心作用
pg_constraint存储所有约束信息(主键、外键、唯一约束、检查约束、默认值约束)
pg_index存储索引的详细信息(所属表、索引字段、是否唯一、是否主键、索引类型)

关键说明:

  • pg_constraint.contype 区分约束类型:p= 主键,u= 唯一约束,f= 外键,c= 检查约束,d= 默认值约束。
  • pg_index.indisunique = true 表示唯一索引,indisprimary = true 表示主键索引。

查询示例

-- 查看 users 表的所有约束
SELECT conname, contype, conkey 
FROM pg_constraint 
WHERE conrelid = (SELECT oid FROM pg_class WHERE relname = 'users');

-- 查看 users 表的所有唯一索引
SELECT indexrelname AS index_name 
FROM pg_index 
JOIN pg_class t ON pg_index.indrelid = t.oid 
WHERE t.relname = 'users' AND indisunique = true;

4. 用户与权限相关

系统表名核心作用
pg_roles存储数据库中所有角色 / 用户 / 组的信息(用户名、密码哈希、权限、是否超级用户)
pg_authid与 pg_roles 类似,但包含敏感信息(如密码),仅超级用户可访问
pg_permissions存储对象的权限分配信息(哪些用户对哪些对象有哪些权限)

查询示例:

-- 查看所有用户
SELECT rolname, rolsuper, rolcreaterole FROM pg_roles;

-- 查看 users 表的权限分配
SELECT grantee, privilege_type 
FROM information_schema.table_privileges 
WHERE table_name = 'users';

5. 其他常用系统表

系统表名核心作用
pg_tablespace存储表空间信息(数据库物理存储位置)
pg_stat_user_tables存储用户表的统计信息(如行数、读写次数、扫描次数,用于性能分析)
pg_locks存储当前数据库的锁信息(排查锁等待、死锁问题)
pg_stat_activity存储当前数据库连接 / 会话信息(谁在连接、执行什么 SQL、状态)

查询示例:

-- 查看当前所有活跃会话
SELECT usename, datname, query, state 
FROM pg_stat_activity 
WHERE state = 'active';

-- 查看表的行数和读写统计
SELECT relname, n_live_tup AS row_count, seq_scan AS full_scan_count 
FROM pg_stat_user_tables 
WHERE relname = 'users';

二、信息模式(Information Schema):更友好的元数据查询方式

除了原生系统表,PostgreSQL 还提供了 Information Schema(信息模式),它是符合 SQL 标准的视图集合,封装了底层系统表,语法更通用、更易读,适合跨数据库兼容场景。

常用的信息模式视图:

  • information_schema.tables:查询表信息
  • information_schema.columns:查询字段信息
  • information_schema.table_constraints:查询约束信息
  • information_schema.indexes:查询索引信息

示例

-- 用信息模式查询 users 表的字段
SELECT column_name, data_type, is_nullable 
FROM information_schema.columns 
WHERE table_name = 'users' AND table_schema = 'public';

三、系统表使用建议

  1. 新手优先用信息模式:语法更通用,无需记忆系统表的 OID 关联逻辑,降低学习成本。
  2. 高级场景用原生系统表:如需获取更底层的信息(如索引物理属性、锁详情),原生系统表更全面。
  3. 避免直接修改系统表:系统表由 PostgreSQL 自动维护,手动修改可能导致数据库损坏,管理对象应使用 CREATE/ALTER/DROP 命令。
  4. 常用元数据查询可封装函数:比如封装 “查询表的所有约束”“查询表的索引” 等函数,简化日常使用。

总结

  1. 核心系统表分类:数据库 / 模式(pg_database/pg_namespace)、表 / 字段(pg_class/pg_attribute)、约束 / 索引(pg_constraint/pg_index)、用户 / 权限(pg_roles/pg_permissions)、监控 / 锁(pg_stat_activity/pg_locks)是最常用的几类。
  2. 信息模式优势:基于系统表封装的标准视图,语法通用、易读,适合新手和跨数据库场景。
  3. 使用原则:系统表用于查询元数据,禁止手动修改;优先用信息模式,底层需求用原生系统表。

​到此这篇关于Postgresql 系统表作用解释的文章就介绍到这了,更多相关Postgresql 系统表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • PostgreSQL忘记postgres账号密码的解决方法

    PostgreSQL忘记postgres账号密码的解决方法

    这篇文章主要介绍了PostgreSQL忘记postgres账号的密码的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • PostgreSQL 实现定时job执行(pgAgent)

    PostgreSQL 实现定时job执行(pgAgent)

    这篇文章主要介绍了PostgreSQL 实现定时job执行(pgAgent),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PostgreSQL定期验证备份的有效性的完整方案

    PostgreSQL定期验证备份的有效性的完整方案

    在 PostgreSQL 的高可用与灾备体系中, 备份本身不是目标,可恢复才是,本文将系统阐述如何设计并执行一套完整的 PostgreSQL 备份有效性验证方案,涵盖逻辑备份、物理备份、WAL 归档、PITR 恢复、自动化验证及最佳实践,需要的朋友可以参考下
    2026-02-02
  • postgresql数据添加两个字段联合唯一的操作

    postgresql数据添加两个字段联合唯一的操作

    这篇文章主要介绍了postgresql数据添加两个字段联合唯一的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • PostgreSQL如何修改默认端口号

    PostgreSQL如何修改默认端口号

    文章主要内容是关于在升级PostgreSQL过程中遇到的问题,以及解决这些问题的方法,升级过程中,由于端口号设置不正确,导致psql连接到旧版本的服务器,从而引发语法错误,解决方法是在连接数据库时指定正确的端口号,或者修改默认端口号
    2024-12-12
  • Postgresql 动态统计某一列的某一值出现的次数实例

    Postgresql 动态统计某一列的某一值出现的次数实例

    这篇文章主要介绍了Postgresql 动态统计某一列的某一值出现的次数实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • PotgreSQL 基于时间点恢复过程

    PotgreSQL 基于时间点恢复过程

    本篇文章介绍 PostgreSQL 基于时间点恢复(point-in-time-recover)需要的条件及恢复过程,属于操作说明,对PotgreSQL 时间点恢复相关知识感兴趣的朋友跟随小编一起看看吧
    2023-08-08
  • PostgreSQL12同步流复制搭建及主备切换方式

    PostgreSQL12同步流复制搭建及主备切换方式

    这篇文章主要介绍了PostgreSQL12同步流复制搭建及主备切换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • postgreSQL自动生成随机数值的实例

    postgreSQL自动生成随机数值的实例

    这篇文章主要介绍了postgreSQL自动生成随机数值的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Mac OS上安装PostgreSQL完整图文教程

    Mac OS上安装PostgreSQL完整图文教程

    这篇文章主要介绍了Mac OS上安装PostgreSQL的完整图文教程,问文中通过代码详细介绍了如何设置密码、允许远程连接、常用命令、备份与恢复、卸载以及常见问题解决方法,需要的朋友可以参考下
    2026-01-01

最新评论