psql元命令\d系列查看对象定义是PostgreSQL日常使用中绕不开的一项基本功。相比直接查询pg_class、pg_attribute这些系统目录表,psql提供的反斜杠元命令能把对象的结构、类型、索引、约束、注释一次性整理成清晰的表格输出,省去了手写SQL的麻烦。这篇文章把常用的\d系列命令整理一遍,配上实际输出示例,方便随时查阅。

一、\d系列命令的基础用法
在psql里,反斜杠开头的命令叫元命令(meta command),它们由psql客户端本地解析,不会发送到服务器执行,所以响应非常快。最常用的是不带参数的\d,直接回车会列出当前搜索路径下所有可见的关系对象,包括表、视图、物化视图、序列和索引。
如果只想看某一张表的详细定义,在\d后面跟上表名即可,例如\d orders。输出会包含表的列定义、数据类型、可空性、默认值,以及这张表上的索引、约束、外键关系和被哪些视图引用。这个命令堪称排查表结构问题的第一选择。
-- 查看orders表的完整定义
\d orders
-- 输出示例
Table "public.orders"
Column | Type | Nullable | Default
------------+---------+----------+-------------------
id | integer | not null | nextval('orders_id_seq'::regclass)
user_id | integer | not null |
amount | numeric | not null | 0
Indexes:
"orders_pkey" PRIMARY KEY, btree (id)
Foreign-key constraints:
"orders_user_id_fkey" FOREIGN KEY (user_id) REFERENCES users(id)加上加号可以看到更多信息:\d+ orders会额外显示每一列的存储设置、压缩方式、统计目标,以及表的表空间、选项和注释。同样地,\dt+、\df+等几乎所有\d系列命令都支持加号后缀,输出更详细的元数据。
二、按对象类型分类查看:\dt、\dv、\di、\ds、\dn、\dx
不带参数的\d会把所有对象混在一起列出来,实际工作中更常见的是按类型过滤。\dt只列出普通表,\dv只列视图,\di只列索引,\ds只列序列,\dm列物化视图。这些命令都支持可选的模式参数配合通配符使用。
-- 列出所有表 \dt -- 只列出名称以log_开头的表 \dt log_* -- 查看指定schema下的视图 \dv myschema.* -- 列出所有物化视图及大小 \dm+
注意通配符匹配的是整个对象名,*可以匹配任意字符串。如果想跨schema查找,需要写完整的schema限定名,比如\dt *.users会列出所有schema里名为users的表。另外\dn用来列出schema,\dx用来列出已安装的扩展,加上加号还能看到扩展里包含的具体对象清单,排查扩展依赖时非常实用。
三、函数、类型与源码:\df、\dT、\sf、\da
函数相关的查看主要靠\df和\sf。\df列出函数名、返回类型和参数类型,支持按模式过滤,比如\df calc*列出所有以calc开头的函数。想直接看函数的定义源码,用\sf 函数名,它会输出带行号的完整函数体,定位问题行特别方便。
-- 查看函数定义源码 \sf get_user_orders(integer) -- 输出示例 CREATE OR REPLACE FUNCTION public.get_user_orders(uid integer) RETURNS SETOF orders LANGUAGE plpgsql AS $function$ BEGIN RETURN QUERY SELECT * FROM orders WHERE user_id = uid; END; $function$
类型方面,\dT列出数据类型,\dT+能看到类型的元素类型和修饰符。对于自定义枚举类型,配合\dT+还能看到所有枚举值。聚合函数用\da查看,操作符用\do查看。这几个命令在维护自定义类型的库时经常用到。
四、权限与全局对象:\du、\l、\dp
用户和角色相关的查看用\du,它会列出所有角色及其属性,比如是否可以登录、是否是超级用户、属于哪些组。加号还能看到角色的描述信息。数据库列表用\l查看,\l+会附带每个数据库的大小、表空间和编码信息。
权限分配的排查交给\dp,它显示表、视图、序列上的访问权限,输出中的字母缩写对应SELECT、INSERT、UPDATE等权限,配合官方文档的权限速查表可以快速判断某个用户对某张表有哪些操作权限。如果发现某个用户连不上某张表,第一时间跑一遍\dp通常就能找到原因。
-- 查看角色列表 \du -- 查看所有数据库及大小 \l+ -- 查看orders表的权限分配 \dp orders
五、几个提升效率的实用技巧
第一,善用\dD、\dF这类冷门命令。\dD查看默认权限(default privileges),\dF查看文本搜索配置,虽然使用频率不高,但在处理全文检索或权限模板问题时能省不少事。第二,记住可以用\d(string)的形式在\d后面直接跟完整定义查询,比如某些版本里\d跟上表名再加*能递归展开继承表的所有子表。
第二,把元命令和\x配合使用。当表的列特别多时,\d的横向表格会被截断,先执行\x on切换为扩展显示模式,再看\d+的输出会清爽很多。第三,如果想知道某条元命令对应的真实SQL,可以用\set ECHO_HIDDEN on,之后执行任何元命令都会先打印psql底层发出的查询语句,这是学习PostgreSQL系统目录表结构的好办法。
总的来说,psql元命令\d系列查看对象定义这套命令并不复杂,核心是记住类型首字母的对应关系:t是table、v是view、i是index、s是sequence、f是function、n是schema、u加d是用户。熟练之后,大部分结构排查工作都能在psql终端里几秒钟搞定,完全不需要去翻图形化工具或者手写目录表查询。
psql元命令PostgreSQL数据库管理修改时间:2026-09-05 02:04:32