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';