PostgreSQL 中类似 MySQL SHOW TABLES 的查看所有表方法
详细对比在 PostgreSQL 中如何实现类似 MySQL SHOW TABLES 的功能,涵盖 psql 快捷元命令 \dt、查询 information_schema 以及 pg_catalog 系统表的高级技巧。
发布于
对于熟悉 MySQL 的开发者来说,进入数据库后第一句常用的命令通常是 SHOW TABLES;。
但在 PostgreSQL 中,如果你在客户端敲下这行命令,系统会直接无情地报错:
ERROR: syntax error at or near "SHOW"
LINE 1: SHOW TABLES;这是因为 SHOW TABLES 是 MySQL 的专用非标准语法。PostgreSQL 遵循更严密的 SQL 标准与元命令体系。
那么,在 PostgreSQL 中到底该如何查看当前数据库中有哪些表呢?本文为您梳理 3 种最常用、最强大的等效方法。
方法一:使用 psql 终端核心元命令 \dt(最快、最常用)
如果你是在终端通过 psql 命令行连接数据库,官方提供的 \dt 元命令就是 SHOW TABLES 的完美替代品。
1. 查看当前搜索路径(默认 public 模式)下的所有普通表:
\dt
输出示例:
List of relations
Schema | Name | Type | Owner
--------+------------------+-------+----------
public | articles | table | postgres
public | categories | table | postgres
public | users | table | postgres
(3 rows)2. 增强版:\dt+ 查看物理大小与表描述
在命令后加一个加号 +,可以额外查看到每张表在磁盘上的物理占用大小、存储访问方式及注释说明:
\dt+
3. 查看所有模式(Schema)或跨模式过滤:
- 查看全库所有 Schema(包括系统内部表):
\dt *.* - 仅查看特定 Schema(如
core)下的表:\dt core.* - 按表名模式通配符过滤:
\dt user_*
方法二:跨平台通用标准 SQL(查询 information_schema.tables)
如果你使用的是 Python、Java、Node.js 后端代码,或者某些第三方通用数据库管理工具,无法执行 psql 的斜杠元命令,那么应该使用标准的 ANSI SQL 视图:
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public'
AND table_type = 'BASE TABLE'
ORDER BY table_name;
关键字段解析:
table_schema = 'public':极为重要!PostgreSQL 默认将系统元数据放在pg_catalog和information_schema中,如果不加该条件,会连同系统内部的数百张元数据表一并列出。table_type = 'BASE TABLE':过滤掉普通视图(VIEW)和物化视图(MATERIALIZED VIEW),仅保留真实的数据物理表。
方法三:深入 PostgreSQL 底层(查询 pg_catalog.pg_tables 系统字典)
pg_tables 是 PostgreSQL 专用的系统字典视图,查询速度极快,常用于 DBA 编写深度运维与自动化脚本。
SELECT
schemaname AS schema,
tablename AS table_name,
tableowner AS owner,
hasindexes AS has_index
FROM pg_catalog.pg_tables
WHERE schemaname NOT IN ('pg_catalog', 'information_schema')
ORDER BY schemaname, tablename;
此查询不仅能列出所有用户自建表,还会直接告诉你该表是否建立了索引(hasindexes),方便一目了然排查无索引表。
快速速查对比总结
| 需求场景 | 推荐方式 | 核心语句 / 命令 |
|---|---|---|
| 终端日常极速查看 | psql 快捷元命令 | \dt 或 \dt+ |
| 代码/程序通用查询 | ANSI SQL 标准视图 | SELECT table_name FROM information_schema.tables WHERE table_schema = 'public'; |
| DBA 运维与自动化检测 | 底层数据字典 | SELECT * FROM pg_catalog.pg_tables WHERE schemaname = 'public'; |