PostgreSQL系统表作用详解

作者:技术拾光

时间:2026-06-04

浏览:227

PostgreSQL 的系统表到底是干什么的?其实它就是数据库的“元数据仓库”——所有表、字段、索引、约束、用户的定义都记录在这里。今天咱们就来系统地梳理一下,PostgreSQL 的核心系统表有哪些,以及它们各自承担什么角色。 一、核心系统表分类及作用 所有这些系统表都位于 pg_catalog

文章目录

PostgreSQL 的系统表到底是干什么的?其实它就是数据库的“元数据仓库”——所有表、字段、索引、约束、用户的定义都记录在这里。今天咱们就来系统地梳理一下,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_nullFROM pg_attribute aJOIN pg_type t ON a.atttypid = t.oidWHERE 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';

三、系统表使用建议

说了这么多,总结几条实用原则。

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

总结

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

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章