PostgreSQL 系统表(System Catalogs)是存储数据库元数据的核心表,涵盖表、字段、索引、约束、用户等所有对象定义。本文按功能分类梳理这些系统表,并详述其作用与典型查询场景,帮助您快速掌握元数据管理。

了解 PostgreSQL 的系统表(System Catalogs)有哪些,以及它们各自的核心作用是十分必要的。这些系统表负责存储数据库元数据,例如表、字段、索引、约束、用户等信息;所有数据库对象的定义都被记录在其中。接下来将按功能分类梳理核心系统表,同时说明它们的作用和常用场景。
PostgreSQL 的全部系统表都位于 pg_catalog 模式下(可省略模式名直接查询)。以下是最常用的核心表,按功能分组呈现:
| 系统表名 | 核心作用 |
|---|---|
| pg_database | 存储数据库实例中所有数据库的信息(如数据库名、OID、所有者、编码、表空间) |
| pg_namespace | 存储数据库中的所有模式(Schema)信息(如模式名、OID、所有者、权限) |
查询示例:
-- 查看所有数据库SELECT datname, datowner, encoding FROM pg_database;-- 查看当前数据库的所有模式SELECT nspname, nspowner FROM pg_namespace;
| 系统表名 | 核心作用 |
|---|---|
| pg_class | 存储所有关系型对象(表、视图、索引、序列、物化视图等)的核心信息,是最核心的系统表之一 |
| pg_attribute | 存储所有字段(列)的信息(如字段名、所属表 OID、数据类型、是否可为空、默认值) |
| pg_type | 存储所有数据类型的信息(内置类型如 int/text,自定义类型都在这里) |
关键说明:
查询示例:
-- 查看 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;
| 系统表名 | 核心作用 |
|---|---|
| pg_constraint | 存储所有约束信息(主键、外键、唯一约束、检查约束、默认值约束) |
| pg_index | 存储索引的详细信息(所属表、索引字段、是否唯一、是否主键、索引类型) |
关键说明:
查询示例:
-- 查看 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;
| 系统表名 | 核心作用 |
|---|---|
| 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';
| 系统表名 | 核心作用 |
|---|---|
| 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';
除了原生系统表,PostgreSQL 还提供了 Information Schema(信息模式),它是符合 SQL 标准的视图集合,封装了底层系统表,语法更通用、更易读,适合跨数据库兼容场景。
常用的信息模式视图:
示例:
-- 用信息模式查询 users 表的字段SELECT column_name, data_type, is_nullable FROM information_schema.columns WHERE table_name = 'users' AND table_schema = 'public';
CREATE/ALTER/DROP 命令。以上就是关于 PostgreSQL 系统表作用与分类的完整梳理,通过掌握这些核心表及信息模式,您可以高效地进行数据库元数据管理与日常运维。