2024 年 9 月 26 日: PostgreSQL 17 发布!
支持的版本:当前 (17) / 16 / 15 / 14 / 13 / 12
开发版本:devel
不支持的版本:11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

psql

psqlPostgreSQL 交互式终端

概要

psql [选项...] [数据库名 [用户名]]

描述

psql 是一个基于终端的 PostgreSQL 前端。它允许您交互式地输入查询,将它们发送到 PostgreSQL 并查看查询结果。或者,输入可以来自文件或命令行参数。此外,psql 提供了许多元命令和各种类似 shell 的功能,以帮助编写脚本和自动化各种任务。

选项

-a
--echo-all #

将所有非空输入行按原样打印到标准输出。 (这并不适用于交互式读取的行。)这相当于将变量 ECHO 设置为 all

-A
--no-align #

切换到未对齐输出模式。 (默认输出模式为 aligned。)这等同于 \pset format unaligned

-b
--echo-errors #

将失败的 SQL 命令打印到标准错误输出。 这相当于将变量 ECHO 设置为 errors

-c 命令
--command=命令 #

指定 psql 要执行给定的命令字符串 命令。此选项可以重复,并可以以任何顺序与 -f 选项组合使用。当指定了 -c-f 时,psql 不会从标准输入读取命令;而是它在按顺序处理完所有 -c-f 选项后终止。

命令 必须是服务器可以完全解析的命令字符串(即,它不包含任何 psql 特定的功能),或者是一个单独的反斜杠命令。因此,您不能在 -c 选项中混合以下内容:SQLpsql 元命令。要实现这一点,您可以使用重复的 -c 选项或将字符串管道到 psql 中,例如:

psql -c '\x' -c 'SELECT * FROM foo;'

echo '\x \\ SELECT * FROM foo;' | psql

\\ 是分隔符元命令。)

每个SQL传递给 -c 的命令字符串将作为单个请求发送到服务器。因此,服务器会将其作为单个事务执行,即使该字符串包含多个SQL命令,除非该字符串中包含显式的 BEGIN/COMMIT 命令,以将其划分为多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参阅 第 53.2.2.1 节。)

如果不想在单个事务中执行多个命令,请使用重复的 -c 命令或将多个命令馈送到 psql 的标准输入中,可以使用上面说明的 echo 或通过 shell here-document,例如:

psql <<EOF
\x
SELECT * FROM foo;
EOF
--csv #

切换到CSV(逗号分隔值)输出模式。 这等同于 \pset format csv

-d 数据库名
--dbname=数据库名 #

指定要连接的数据库的名称。 这等同于在命令行上指定 数据库名 作为第一个非选项参数。 数据库名 可以是 连接字符串。如果是这样,连接字符串参数将覆盖任何冲突的命令行选项。

-e
--echo-queries #

将发送到服务器的所有 SQL 命令也复制到标准输出。 这相当于将变量 ECHO 设置为 queries

-E
--echo-hidden #

回显由 \d 和其他反斜杠命令生成的实际查询。您可以使用此功能来研究 psql 的内部操作。 这相当于将变量 ECHO_HIDDEN 设置为 on

-f 文件名
--file=文件名 #

从文件 文件名 读取命令,而不是标准输入。此选项可以重复,并可以以任何顺序与 -c 选项组合使用。当指定了 -c-f 时,psql 不会从标准输入读取命令;而是它在按顺序处理完所有 -c-f 选项后终止。除此之外,此选项在很大程度上等同于元命令 \i

如果 文件名-(连字符),则从标准输入读取,直到出现 EOF 指示或 \q 元命令。这可用于在交互式输入与来自文件中的输入之间进行交织。但是请注意,在这种情况下不会使用 Readline(就像指定了 -n 一样)。

使用此选项与编写 psql < 文件名 有细微差别。通常,两者都会如您预期的那样工作,但使用 -f 可以实现一些不错的功能,例如带有行号的错误消息。还有一种可能性是使用此选项可以减少启动开销。另一方面,使用 shell 输入重定向的变体(理论上)保证会产生与您手动输入所有内容时完全相同的输出。

-F 分隔符
--field-separator=分隔符 #

使用 分隔符 作为未对齐输出的字段分隔符。 这等同于 \pset fieldsep\f

-h 主机名
--host=主机名 #

指定运行服务器的机器的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。

-H
--html #

切换到HTML输出模式。 这等同于 \pset format html\H 命令。

-l
--list #

列出所有可用数据库,然后退出。其他非连接选项将被忽略。这类似于元命令 \list

使用此选项时,psql 将连接到数据库 postgres,除非在命令行上命名了其他数据库(选项 -d 或非选项参数,可能通过服务条目,但不通过环境变量)。

-L 文件名
--log-file=文件名 #

将所有查询输出写入文件 文件名,除了正常的输出目标。

-n
--no-readline #

不要使用 Readline 进行行编辑,也不要使用命令历史记录(参见 名为“命令行编辑”的部分)。

-o 文件名
--output=文件名 #

将所有查询输出放入文件 文件名 中。 这等同于命令 \o

-p 端口
--port=端口 #

指定服务器监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认值为 PGPORT 环境变量的值,如果未设置,则为编译时指定的端口,通常为 5432。

-P 赋值
--pset=赋值 #

指定打印选项,类似于 \pset。请注意,这里您需要使用等号而不是空格来分隔名称和值。例如,要将输出格式设置为 LaTeX,您可以编写 -P format=latex

-q
--quiet #

指定 psql 以静默模式执行。默认情况下,它会打印欢迎消息和各种信息输出。如果使用此选项,则不会发生任何此类操作。这在使用 -c 选项时很有用。这等效于将变量 QUIET 设置为 on

-R 分隔符
--record-separator=分隔符 #

使用 分隔符 作为未对齐输出的记录分隔符。这等效于 \pset recordsep

-s
--single-step #

以单步模式运行。这意味着在向服务器发送每个命令之前,系统会提示用户,并提供取消执行的选项。使用此功能调试脚本。

-S
--single-line #

以单行模式运行,其中换行符终止 SQL 命令,就像分号一样。

注意

提供此模式是为了满足那些坚持使用它的人,但我们不鼓励您使用它。特别地,如果您在一行上混合使用SQL和元命令,则执行顺序可能并不总是对没有经验的用户很清楚。

-t
--tuples-only #

关闭列名和结果行计数页脚等的打印。这等效于 \t\pset tuples_only

-T 表选项
--table-attr=表选项 #

指定要放置在HTML table 标签中的选项。有关详细信息,请参阅 \pset tableattr

-U 用户名
--username=用户名 #

以用户 用户名 连接到数据库,而不是默认用户。(您必须拥有执行此操作的权限。)

-v 赋值
--set=赋值
--variable=赋值 #

执行变量赋值,类似于 \set 元命令。请注意,您必须在命令行上使用等号分隔名称和值(如果有)。要取消设置变量,请省略等号。要设置一个空值的变量,请使用等号,但省略值。这些赋值是在命令行处理过程中完成的,因此反映连接状态的变量将在以后被覆盖。

-V
--version #

打印 psql 版本并退出。

-w
--no-password #

从不发出密码提示。如果服务器需要密码身份验证,并且密码不可从其他来源(例如 .pgpass 文件)获得,则连接尝试将失败。此选项在批处理作业和没有用户输入密码的脚本中很有用。

请注意,此选项将在整个会话中保持设置,因此它也会影响元命令 \connect 以及初始连接尝试。

-W
--password #

强制 psql 在连接到数据库之前提示输入密码,即使不会使用该密码。

如果服务器需要密码身份验证,并且密码不可从其他来源(例如 .pgpass 文件)获得,则 psql 将在任何情况下提示输入密码。但是,psql 将浪费一次连接尝试来确定服务器是否需要密码。在某些情况下,值得键入 -W 以避免额外的连接尝试。

请注意,此选项将在整个会话中保持设置,因此它也会影响元命令 \connect 以及初始连接尝试。

-x
--expanded #

启用扩展表格格式模式。这等效于 \x\pset expanded

-X
--no-psqlrc #

不要读取启动文件(既不读取系统范围的 psqlrc 文件,也不读取用户的 ~/.psqlrc 文件)。

-z
--field-separator-zero #

将未对齐输出的字段分隔符设置为零字节。这等效于 \pset fieldsep_zero

-0
--record-separator-zero #

将未对齐输出的记录分隔符设置为零字节。这在与 xargs -0 等进行接口时非常有用。这等效于 \pset recordsep_zero

-1
--single-transaction #

此选项只能与一个或多个 -c 和/或 -f 选项一起使用。它会导致 psql 在第一个这样的选项之前发出 BEGIN 命令,并在最后一个选项之后发出 COMMIT 命令,从而将所有命令包装到单个事务中。如果任何命令失败,并且变量 ON_ERROR_STOP 已设置,则会发送 ROLLBACK 命令。这确保了要么所有命令都成功完成,要么没有应用任何更改。

如果命令本身包含 BEGINCOMMITROLLBACK,则此选项将不会产生预期的效果。此外,如果单个命令无法在事务块中执行,则指定此选项会导致整个事务失败。

-?
--help[=主题] #

显示有关 psql 的帮助信息并退出。可选的 主题 参数(默认为 options)选择解释 psql 的哪一部分:commands 描述 psql 的反斜杠命令;options 描述可以传递给 psql 的命令行选项;variables 显示有关 psql 配置变量的帮助信息。

退出状态

psql 如果正常完成,则向 shell 返回 0,如果发生其自身的致命错误(例如内存不足、文件未找到),则返回 1,如果与服务器的连接中断并且会话不是交互式的,则返回 2,如果在脚本中发生错误并且变量 ON_ERROR_STOP 已设置,则返回 3。

用法

连接到数据库

psql 是一个常规的 PostgreSQL 客户端应用程序。为了连接到数据库,您需要知道目标数据库的名称、服务器的主机名和端口号,以及您要连接的数据库用户名。可以通过命令行选项(即 -d-h-p-U)分别告诉 psql 这些参数。如果找到不属于任何选项的参数,它将被解释为数据库名称(或者数据库用户名,如果数据库名称已经给出)。并非所有这些选项都是必需的;存在有用的默认值。如果您省略主机名,则 psql 将通过 Unix 域套接字连接到本地主机上的服务器,或者通过 TCP/IP 连接到 Windows 上的 localhost。默认端口号是在编译时确定的。由于数据库服务器使用相同的默认值,因此在大多数情况下您不需要指定端口。默认数据库用户名是您的操作系统用户名。一旦确定了数据库用户名,它将用作默认数据库名称。请注意,您不能仅连接到任何数据库下的任何数据库用户名。您的数据库管理员应该已经告知您有关您的访问权限的信息。

当默认值不完全正确时,您可以通过设置环境变量 PGDATABASEPGHOSTPGPORT 和/或 PGUSER 为其设置适当的值,从而节省一些输入时间。(有关其他环境变量,请参阅 第 32.15 节。)使用 ~/.pgpass 文件来避免定期输入密码也很方便。有关更多信息,请参阅 第 32.16 节

另一种指定连接参数的方法是在 conninfo 字符串或URI中,它用于代替数据库名称。这种机制使您可以非常广泛地控制连接。例如

$ psql "service=myservice sslmode=require"
$ psql postgresql://dbmaster:5433/mydb?sslmode=require

这样,您还可以使用LDAP来查找连接参数,如 第 32.18 节 中所述。有关所有可用连接选项的更多信息,请参阅 第 32.1.2 节

如果由于任何原因无法建立连接(例如,权限不足、服务器未在目标主机上运行等),则 psql 将返回错误并终止。

如果标准输入和标准输出都是终端,则 psql 会将客户端编码设置为 auto,它将从区域设置(Unix 系统上的 LC_CTYPE 环境变量)检测适当的客户端编码。如果结果与预期不符,则可以使用环境变量 PGCLIENTENCODING 覆盖客户端编码。

输入 SQL 命令

在正常操作中,psql 会提供一个提示,其中包含 psql 当前连接到的数据库的名称,后跟字符串 =>。例如

$ psql testdb
psql (17.0)
Type "help" for help.

testdb=>

在提示符下,用户可以输入SQL命令。通常,当遇到命令结束的分号时,输入行会被发送到服务器。行尾不会终止命令。因此,为了清晰起见,命令可以跨越多行。如果命令已发送并执行成功,则命令的结果将显示在屏幕上。

如果不受信任的用户可以访问未采用安全模式的数据库,请在开始会话时从search_path中移除可公开写入的模式。您可以将options=-csearch_path=添加到连接字符串或在执行其他 SQL 命令之前发出SELECT pg_catalog.set_config('search_path', '', false)。此考量并非特定于psql;它适用于执行任意 SQL 命令的每个接口。

每当执行命令时,psql 还会轮询由LISTENNOTIFY 生成的异步通知事件。

虽然 C 样式的块注释会被传递到服务器进行处理和移除,但 SQL 标准的注释会被 psql 移除。

元命令

psql 中输入的任何以未加引号的反斜杠开头的内容都是由 psql 本身处理的 psql 元命令。这些命令使 psql 更适用于管理或脚本编写。元命令通常被称为斜杠或反斜杠命令。

一个 psql 命令的格式是反斜杠,紧跟着一个命令动词,然后是任何参数。参数用任意数量的空白字符与命令动词和其他参数隔开。

要在一个参数中包含空白,您可以用单引号将它引起来。要在一个参数中包含单引号,请在单引号文本中写两个单引号。此外,单引号中包含的任何内容都将进行 C 风格的替换,例如 \n(换行符)、\t(制表符)、\b(退格符)、\r(回车符)、\f(换页符)、\digits(八进制)和 \xdigits(十六进制)。在单引号文本中,反斜杠位于任何其他字符之前,则对该字符进行引用,无论该字符是什么。

如果一个参数中出现未加引号的冒号 (:) 后面跟着一个 psql 变量名,则它会被变量的值替换,如以下SQL 插值 部分所述。在那里描述的 :'variable_name':"variable_name" 形式也适用。 :{?variable_name} 语法允许测试变量是否已定义。它将被替换为 TRUE 或 FALSE。用反斜杠对冒号进行转义可以防止它被替换。

在一个参数中,用反引号 (`) 包裹的文本会被视为传递给 shell 的命令行。该命令的输出(包括任何尾随换行符)将替换反引号包裹的文本。在反引号包裹的文本中,不会进行任何特殊引用或其他处理,除了 :variable_name 的出现,其中 variable_name 是一个 psql 变量名,将被变量的值替换。此外,:'variable_name' 的出现将被变量的值替换,该值被适当地引用,以便成为一个单独的 shell 命令参数。(在大多数情况下,后一种形式更可取,除非你非常确定变量中的内容。)由于回车符和换行符不能在所有平台上安全地引用,因此当这些字符出现在值中时,:'variable_name' 形式将打印一条错误消息,并且不会替换变量值。

某些命令需要一个SQL标识符(如表名)作为参数。这些参数遵循以下语法规则:SQL: 未加引号的字母将被强制转换为小写,而双引号 (") 会保护字母不受大小写转换,并允许将空格合并到标识符中。在双引号内,成对的双引号会简化为单个双引号,成为最终名称的一部分。例如,FOO"BAR"BAZ 被解释为 fooBARbaz,而 "A weird"" name" 变为 A weird" name

对参数的解析在行尾停止,或者当遇到另一个未加引号的反斜杠时停止。未加引号的反斜杠被视为新元命令的开始。特殊序列 \\(两个反斜杠)表示参数的结束,并继续解析SQL命令,如果有的话。这样SQLpsql 命令可以在一行上自由混合。但在任何情况下,元命令的参数都不能超过行尾。

许多元命令作用于当前查询缓冲区。这只是一个缓冲区,用于保存已输入但尚未发送到服务器以执行的 SQL 命令文本。这将包括之前的输入行以及同一行上元命令之前的任何文本。

定义了以下元命令

\a #

如果当前的表格输出格式为未对齐,则切换为对齐。如果它不是未对齐的,则将其设置为未对齐。保留此命令是为了向后兼容。有关更通用的解决方案,请参见 \pset

\bind [ parameter ] ... #

为下一个查询执行设置查询参数,并将指定的参数传递给任何参数占位符 ($1 等)。

示例

INSERT INTO tbl1 VALUES ($1, $2) \bind 'first value' 'second value' \g

这对于除了 \g 之外的查询执行命令(如 \gx\gset)也有效。

此命令会导致使用扩展查询协议(参见第 53.1.2 节),这与正常的 psql 操作不同,后者使用简单查询协议。因此,此命令可用于测试来自 psql 的扩展查询协议。(即使查询没有参数并且此命令指定零个参数,也会使用扩展查询协议。)此命令仅影响下一个执行的查询;所有后续查询默认使用简单查询协议。

\c\connect [ -reuse-previous=on|off ] [ dbname [ username ] [ host ] [ port ] | conninfo ] #

建立与 PostgreSQL 服务器的新连接。可以使用位置语法(数据库名称、用户、主机和端口中的一个或多个)或使用conninfo连接字符串(如第 32.1.1 节中所述)来指定要使用的连接参数。如果未给出任何参数,则使用与之前相同的参数建立新连接。

dbnameusernamehostport 中的任何一个指定为 - 等同于省略该参数。

新连接可以重新使用先前连接的连接参数;不仅包括数据库名称、用户、主机和端口,还包括其他设置,如sslmode。默认情况下,在位置语法中会重新使用参数,但在给出conninfo字符串时则不会。传递第一个参数 -reuse-previous=on-reuse-previous=off 会覆盖该默认值。如果重新使用参数,则任何未明确指定为位置参数或在conninfo字符串中指定的参数都将从现有连接的参数中获取。一个例外是,如果使用位置语法将host设置更改为其先前值,则现有连接参数中存在的任何hostaddr设置将被删除。此外,只有在用户、主机和端口设置未更改时,才会重新使用现有连接使用的任何密码。当命令既不指定也不重新使用特定参数时,将使用libpq默认值。

如果成功建立新连接,则将关闭先前连接。如果连接尝试失败(用户名错误、访问被拒绝等),则如果 psql 处于交互模式,则会保留先前连接。但在执行非交互式脚本时,将关闭旧连接并报告错误。这可能会或可能不会终止脚本;如果它没有终止,则所有数据库访问命令都将失败,直到成功执行另一个 \connect 命令。选择这种区别是为了方便用户避免输入错误,另一方面,也是一种安全机制,可以防止脚本意外地作用于错误的数据库。请注意,每当 \connect 命令尝试重新使用参数时,重新使用的值都是最后一次成功连接的值,而不是随后进行的任何失败尝试的值。但是,在非交互式 \connect 失败的情况下,不允许重新使用任何参数,因为脚本可能期望从失败的 \connect 中重新使用值。

示例

=> \c mydb myuser host.dom 6432
=> \c service=foo
=> \c "host=localhost port=5432 dbname=mydb connect_timeout=10 sslmode=disable"
=> \c -reuse-previous=on sslmode=require    -- changes only sslmode
=> \c postgresql://tom@localhost/mydb?application_name=myapp
\C [ title ] #

设置任何作为查询结果打印的表格的标题,或者取消设置任何此类标题。此命令等效于 \pset title title。(此命令的名称源于caption,因为它以前仅用于在HTML表格中设置标题。)

\cd [ directory ] #

将当前工作目录更改为 directory。如果未给出参数,则更改为当前用户的家目录。

提示

要打印当前工作目录,请使用 \! pwd

\conninfo #

输出有关当前数据库连接的信息。

\copy { table [ ( column_list ) ] } from { 'filename' | program 'command' | stdin | pstdin } [ [ with ] ( option [, ...] ) ] [ where condition ]
\copy { table [ ( column_list ) ] | ( query ) } to { 'filename' | program 'command' | stdout | pstdout } [ [ with ] ( option [, ...] ) ] #

执行前端(客户端)复制。这是一种在SQL COPY 命令,但不是服务器读取或写入指定的文件,psql 读取或写入文件,并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和权限是本地用户的权限,而不是服务器的权限,并且不需要任何 SQL 超级用户权限。

当指定了 program 时,command 将由 psql 执行,并且从 command 传入或传出的数据将在服务器和客户端之间路由。同样,执行权限是本地用户的权限,而不是服务器的权限,并且不需要任何 SQL 超级用户权限。

对于 \copy ... from stdin,数据行从发出命令的相同源读取,继续直到读取 \. 或流到达EOF. 此选项对于在 SQL 脚本文件中内联填充表很有用。对于 \copy ... to stdout,输出将发送到与 psql 命令输出相同的位置,并且 COPY count 命令状态不会打印(因为它可能与数据行混淆)。要读取/写入 psql 的标准输入或输出,无论当前命令源或 \o 选项如何,请写入 from pstdinto pstdout

此命令的语法类似于SQL COPY 命令。除数据源/目标之外的所有选项都与 COPY 中指定的选项相同。因此,\copy 元命令适用特殊解析规则。与大多数其他元命令不同,行的整个剩余部分始终被视为 \copy 的参数,并且在参数中不执行变量插值或反引号扩展。

提示

获取与 \copy ... to 相同结果的另一种方法是使用SQL COPY ... TO STDOUT 命令,并使用 \g filename\g |program 终止它。与 \copy 不同,这种方法允许命令跨越多行;此外,可以使用变量插值和反引号扩展。

提示

这些操作不像SQL COPY 命令使用文件或程序数据源或目标那样高效,因为所有数据都必须通过客户端/服务器连接。对于大量数据,SQL命令可能更可取。另外,由于这种直通方法,\copy ... from inCSV模式将错误地将一行上的单独 \. 数据值视为输入结束标记。

显示 PostgreSQL 的版权和分发条款。

\crosstabview [ colV [ colH [ colD [ sortcolH ] ] ] ] #

执行当前查询缓冲区(如 \g),并在交叉表网格中显示结果。查询必须返回至少三列。由 colV 标识的输出列成为垂直标题,由 colH 标识的输出列成为水平标题。 colD 标识要在网格中显示的输出列。 sortcolH 标识水平标题的可选排序列。

每个列规范可以是列号(从 1 开始)或列名。通常的 SQL 大小写折叠和引用规则适用于列名。如果省略,则 colV 被视为列 1,colH 被视为列 2。 colH 必须与 colV 不同。如果未指定 colD,则查询结果中必须正好有三列,并且既不是 colV 也不是 colH 的列被认为是 colD

垂直标题显示为最左侧的列,包含在列 colV 中找到的值,与查询结果中的顺序相同,但去除了重复项。

水平标题显示为第一行,包含在列 colH 中找到的值,并去除了重复项。默认情况下,这些值按与查询结果相同的顺序出现。但如果给出了可选的 sortcolH 参数,它将标识一列,其值必须是整数,并且来自 colH 的值将根据相应的 sortcolH 值按顺序出现在水平标题中。

在交叉表网格内,对于 colH 的每个不同值 xcolV 的每个不同值 y,位于交叉点 (x,y) 的单元格包含查询结果行中 colD 列的值,其中 colH 的值为 xcolV 的值为 y。如果没有这样的行,则单元格为空。如果有多个这样的行,则会报告错误。

\d[S+] [ pattern ] #

对于每个与 pattern 匹配的关系(表、视图、物化视图、索引、序列或外部表)或复合类型,显示所有列、类型、表空间(如果不是默认表空间)以及任何特殊属性,例如 NOT NULL 或默认值。还显示关联的索引、约束、规则和触发器。对于外部表,还将显示关联的外部服务器。(匹配模式 在下面 Patterns 中定义。)

对于某些类型的关系,\d 将显示每列的附加信息:序列的列值、索引的索引表达式以及外部表的外部数据包装器选项。

命令形式 \d+ 与之相同,只是显示了更多信息:显示与表列关联的任何注释,以及表中是否存在 OID,如果关系是视图,则显示视图定义,显示非默认的 副本标识 设置,以及如果关系具有访问方法,则显示 访问方法 名称。

默认情况下,只显示用户创建的对象;提供模式或 S 修饰符以包含系统对象。

注意

如果 \d 在没有 pattern 参数的情况下使用,它等同于 \dtvmsE,它将显示所有可见表、视图、物化视图、序列和外部表的列表。这纯粹是一个方便措施。

\da[S] [ pattern ] #

列出聚合函数,以及它们的返回类型和它们操作的数据类型。如果指定了 pattern,则只显示名称与模式匹配的聚合。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符以包含系统对象。

\dA[+] [ pattern ] #

列出访问方法。如果指定了 pattern,则只显示名称与模式匹配的访问方法。如果将 + 附加到命令名称,则每个访问方法都将与其关联的处理程序函数和描述一起列出。

\dAc[+] [access-method-pattern [input-type-pattern]] #

列出操作符类(参见 Section 36.16.1)。如果指定了 access-method-pattern,则只列出与名称与该模式匹配的访问方法关联的操作符类。如果指定了 input-type-pattern,则只列出与名称与该模式匹配的输入类型关联的操作符类。如果将 + 附加到命令名称,则每个操作符类都将与其关联的操作符族和所有者一起列出。

\dAf[+] [access-method-pattern [input-type-pattern]] #

列出操作符族(参见 Section 36.16.5)。如果指定了 access-method-pattern,则只列出与名称与该模式匹配的访问方法关联的操作符族。如果指定了 input-type-pattern,则只列出与名称与该模式匹配的输入类型关联的操作符族。如果将 + 附加到命令名称,则每个操作符族都将与其所有者一起列出。

\dAo[+] [access-method-pattern [operator-family-pattern]] #

列出与操作符族关联的操作符(参见 Section 36.16.2)。如果指定了 access-method-pattern,则只列出与名称与该模式匹配的访问方法关联的操作符族的成员。如果指定了 operator-family-pattern,则只列出名称与该模式匹配的操作符族的成员。如果将 + 附加到命令名称,则每个操作符都将与其排序操作符族一起列出(如果它是排序操作符)。

\dAp[+] [access-method-pattern [operator-family-pattern]] #

列出与操作符族关联的支持函数(参见 Section 36.16.3)。如果指定了 access-method-pattern,则只列出与名称与该模式匹配的访问方法关联的操作符族的函数。如果指定了 operator-family-pattern,则只列出名称与该模式匹配的操作符族的函数。如果将 + 附加到命令名称,则函数将以详细方式显示,并带有其实际参数列表。

\db[+] [ pattern ] #

列出表空间。如果指定了 pattern,则仅显示名称与模式匹配的表空间。如果在命令名称后追加 +,则每个表空间将与其关联的选项、磁盘上的大小、权限和描述一起列出。

\dc[S+] [ pattern ] #

列出字符集编码之间的转换。如果指定了 pattern,则仅列出名称与模式匹配的转换。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果在命令名称后追加 +,则每个对象将与其关联的描述一起列出。

\dconfig[+] [ pattern ] #

列出服务器配置参数及其值。如果指定了 pattern,则仅列出名称与模式匹配的参数。如果没有 pattern,则仅列出设置为非默认值的参数。(使用 \dconfig * 查看所有参数。)如果在命令名称后追加 +,则每个参数将与其数据类型、设置参数的上下文以及访问权限一起列出(如果已授予非默认访问权限)。

\dC[+] [ pattern ] #

列出类型转换。如果指定了 pattern,则仅列出其源类型或目标类型与模式匹配的转换。如果在命令名称后追加 +,则每个对象将与其关联的描述一起列出。

\dd[S] [ pattern ] #

显示类型为 constraintoperator classoperator familyruletrigger 的对象的描述。所有其他注释可以通过这些对象类型的相应反斜杠命令查看。

\dd 显示与 pattern 匹配的对象的描述,或者如果未给出参数,则显示可见对象的相应类型的描述。但在任何情况下,仅列出具有描述的对象。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。

可以使用 COMMENTSQL命令创建对象的描述。

\dD[S+] [ pattern ] #

列出域。如果指定了 pattern,则仅显示名称与模式匹配的域。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果在命令名称后追加 +,则每个对象将与其关联的权限和描述一起列出。

\ddp [ pattern ] #

列出默认访问权限设置。对于每个已更改其默认权限设置的角色(如果适用,还包括模式),将显示一个条目。如果指定了 pattern,则仅列出角色名或模式名与模式匹配的条目。

ALTER DEFAULT PRIVILEGES 命令用于设置默认访问权限。权限显示的含义在 第 5.8 节 中解释。

\dE[S+] [ pattern ]
\di[S+] [ pattern ]
\dm[S+] [ pattern ]
\ds[S+] [ pattern ]
\dt[S+] [ pattern ]
\dv[S+] [ pattern ] #

在此命令组中,字母 Eimstv 分别代表外部表、索引、物化视图、序列、表和视图。您可以按任何顺序指定这些字母中的任何一个或全部,以获取这些类型对象的列表。例如,\dti 列出表和索引。如果在命令名称后追加 +,则每个对象将与其持久性状态(永久、临时或非日志)、磁盘上的物理大小以及关联的描述(如果有)一起列出。如果指定了 pattern,则仅列出名称与模式匹配的对象。默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。

\des[+] [ pattern ] #

列出外部服务器(助记符:外部服务器)。如果指定了 pattern,则仅列出名称与模式匹配的服务器。如果使用 \des+ 形式,则会显示每个服务器的完整描述,包括服务器的访问权限、类型、版本、选项和描述。

\det[+] [ pattern ] #

列出外部表(助记符:外部表)。如果指定了 pattern,则仅列出表名或模式名与模式匹配的条目。如果使用 \det+ 形式,则还会显示通用选项和外部表描述。

\deu[+] [ pattern ] #

列出用户映射(助记符:外部用户)。如果指定了 pattern,则仅列出用户名与模式匹配的映射。如果使用 \deu+ 形式,则会显示有关每个映射的其他信息。

警告

\deu+ 还可能显示远程用户的用户名和密码,因此应注意不要泄露它们。

\dew[+] [ pattern ] #

列出外部数据包装器(助记符:外部包装器)。如果指定了 pattern,则仅列出名称与模式匹配的外部数据包装器。如果使用 \dew+ 形式,则还会显示外部数据包装器的访问权限、选项和描述。

\df[anptwS+] [ pattern [ arg_pattern ... ] ] #

列出函数,以及它们的返回值类型、参数数据类型和函数类型,这些函数被分类为 agg(聚合)、normalproceduretriggerwindow。要仅显示特定类型函数,请在命令中添加相应的字母 anptw。如果指定了 pattern,则仅显示名称与模式匹配的函数。任何其他参数都是类型名称模式,它们与函数的第一个、第二个等参数的类型名称匹配。(匹配函数可以拥有比您指定的更多的参数。要防止这种情况,请将破折号 - 作为最后一个 arg_pattern。)默认情况下,仅显示用户创建的对象;提供模式或 S 修饰符以包括系统对象。如果使用 \df+ 形式,则会显示有关每个函数的其他信息,包括易变性、并行安全、所有者、安全分类、访问权限、语言、内部名称(仅限 C 和内部函数)以及描述。可以使用 \sf 查看特定函数的源代码。

\dF[+] [ pattern ] #

列出文本搜索配置。如果指定了 pattern,则仅显示名称与模式匹配的配置。如果使用 \dF+ 形式,则会显示每个配置的完整描述,包括基础文本搜索解析器和每个解析器标记类型的字典列表。

\dFd[+] [ pattern ] #

列出文本搜索字典。如果指定了 pattern,则仅显示名称与模式匹配的字典。如果使用 \dFd+ 形式,则会显示有关每个选定字典的其他信息,包括基础文本搜索模板和选项值。

\dFp[+] [ pattern ] #

列出文本搜索解析器。如果指定了 pattern,则仅显示名称与模式匹配的解析器。如果使用 \dFp+ 形式,则会显示每个解析器的完整描述,包括基础函数和识别的标记类型列表。

\dFt[+] [ pattern ] #

列出文本搜索模板。如果指定了 pattern,则仅显示名称与模式匹配的模板。如果使用 \dFt+ 形式,则会显示有关每个模板的其他信息,包括基础函数名称。

\dg[S+] [ pattern ] #

列出数据库角色。(由于用户的概念已统一为角色,因此此命令现在等同于\du。)默认情况下,仅显示用户创建的角色;提供S修饰符以包括系统角色。如果指定了pattern,则仅列出其名称与模式匹配的角色。如果使用\dg+形式,则会显示有关每个角色的附加信息;目前,这会为每个角色添加注释。

\dl[+] #

这是\lo_list的别名,它显示大型对象列表。如果在命令名称后附加+,则每个大型对象将与其关联的权限(如果有)一起列出。

\dL[S+] [ pattern ] #

列出过程语言。如果指定了pattern,则仅列出其名称与模式匹配的语言。默认情况下,仅显示用户创建的语言;提供S修饰符以包括系统对象。如果在命令名称后附加+,则会将每种语言与其调用处理程序、验证程序、访问权限以及它是否是系统对象一起列出。

\dn[S+] [ pattern ] #

列出模式(命名空间)。如果指定了pattern,则仅列出其名称与模式匹配的模式。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则会将每个对象与其关联的权限和描述(如果有)一起列出。

\do[S+] [ pattern [ arg_pattern [ arg_pattern ] ] ] #

列出运算符及其操作数和结果类型。如果指定了pattern,则仅列出其名称与模式匹配的运算符。如果指定了一个arg_pattern,则仅列出其右操作数的类型名称与该模式匹配的前缀运算符。如果指定了两个arg_pattern,则仅列出其操作数类型名称与这些模式匹配的二元运算符。(或者,为一元运算符的未使用操作数写-。)默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则会显示有关每个运算符的附加信息,目前仅显示底层函数的名称。

\dO[S+] [ pattern ] #

列出排序规则。如果指定了pattern,则仅列出其名称与模式匹配的排序规则。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。如果在命令名称后附加+,则会将每个排序规则与其关联的描述(如果有)一起列出。请注意,仅显示与当前数据库编码兼容的排序规则,因此结果可能在同一安装的不同数据库中有所不同。

\dp[S] [ pattern ] #

列出表、视图和序列及其关联的访问权限。如果指定了pattern,则仅列出其名称与模式匹配的表、视图和序列。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。

The GRANT and REVOKE commands are used to set access privileges. The meaning of the privilege display is explained in Section 5.8.

\dP[itn+] [ pattern ] #

列出分区关系。如果指定了pattern,则仅列出其名称与模式匹配的条目。修饰符t(表)和i(索引)可以附加到命令,以过滤要列出的关系类型。默认情况下,将列出分区表和索引。

如果使用修饰符n嵌套),或指定模式,则将包括非根分区关系,并且将显示一列,显示每个分区关系的父级。

如果在命令名称后附加+,还会显示每个关系的分区大小之和,以及关系的描述。如果n+结合使用,则会显示两个大小:一个包括直接附加的叶分区的总大小,另一个显示所有分区的总大小,包括间接附加的子分区。

\drds [ role-pattern [ database-pattern ] ] #

列出定义的配置设置。这些设置可以是特定于角色的、特定于数据库的,或者两者都是。role-patterndatabase-pattern分别用于选择要列出的特定角色和数据库。如果省略,或如果指定了*,则将列出所有设置,包括那些不是特定于角色或特定于数据库的设置。

The ALTER ROLE and ALTER DATABASE commands are used to define per-role and per-database configuration settings.

\drg[S] [ pattern ] #

列出有关每个已授予的角色成员资格的信息,包括分配的选项(ADMININHERIT和/或SET)和授予者。有关角色成员资格的信息,请参见GRANT命令。

默认情况下,仅显示对用户创建角色的授予;提供S修饰符以包括系统角色。如果指定了pattern,则仅显示对其名称与模式匹配的角色的授予。

\dRp[+] [ pattern ] #

列出复制出版物。如果指定了pattern,则仅列出其名称与模式匹配的出版物。如果在命令名称后附加+,则还会显示与每个出版物关联的表和模式。

\dRs[+] [ pattern ] #

列出复制订阅。如果指定了pattern,则仅列出其名称与模式匹配的订阅。如果在命令名称后附加+,则会显示订阅的其他属性。

\dT[S+] [ pattern ] #

列出数据类型。如果指定了pattern,则仅列出其名称与模式匹配的类型。如果在命令名称后附加+,则会将每个类型与其内部名称和大小、其允许值(如果它是enum类型)及其关联的权限一起列出。默认情况下,仅显示用户创建的对象;提供模式或S修饰符以包括系统对象。

\du[S+] [ pattern ] #

列出数据库角色。(由于用户的概念已统一为角色,因此此命令现在等同于\dg。)默认情况下,仅显示用户创建的角色;提供S修饰符以包括系统角色。如果指定了pattern,则仅列出其名称与模式匹配的角色。如果使用\du+形式,则会显示有关每个角色的附加信息;目前,这会为每个角色添加注释。

\dx[+] [ pattern ] #

列出已安装的扩展。如果指定了pattern,则仅列出其名称与模式匹配的扩展。如果使用\dx+形式,则会列出每个匹配扩展的所有对象。

\dX [ pattern ] #

列出扩展统计信息。如果指定了pattern,则仅列出其名称与模式匹配的扩展统计信息。

每种扩展统计信息的状态将在以其统计信息类型命名的列中显示(例如 Ndistinct)。defined 表示在创建统计信息时已请求它,而 NULL 表示没有请求它。如果想了解是否运行了 ANALYZE 以及计划程序是否可以使用统计信息,可以使用 pg_stats_ext

\dy[+] [ pattern ] #

列出事件触发器。如果指定了pattern,则仅列出其名称与模式匹配的事件触发器。如果在命令名称后附加+,则会将每个对象与其关联的描述一起列出。

\e\edit [ filename ] [ line_number ] #

如果指定了 filename,则编辑该文件;编辑器退出后,文件的内容将复制到当前查询缓冲区。如果没有给出 filename,则将当前查询缓冲区复制到一个临时文件,然后以相同的方式对其进行编辑。或者,如果当前查询缓冲区为空,则将最近执行的查询复制到一个临时文件,并以相同的方式进行编辑。

如果您编辑了文件或上一个查询,并在未修改文件的情况下退出编辑器,则查询缓冲区将被清除。否则,查询缓冲区的新内容将根据 psql 的正常规则重新解析,将整个缓冲区视为一行。任何完整的查询都会立即执行;也就是说,如果查询缓冲区包含或以分号结尾,则直到该点的所有内容都会被执行并从查询缓冲区中删除。查询缓冲区中剩下的内容将被重新显示。键入分号或 \g 发送它,或 \r 通过清除查询缓冲区来取消它。

将缓冲区视为单行主要影响元命令:元命令之后的缓冲区中的任何内容都将被视为元命令的参数,即使它跨越多行。(因此,您不能以这种方式创建使用元命令的脚本。为此请使用 \i。)

如果指定了行号,psql 将把光标定位在文件或查询缓冲区的指定行上。请注意,如果给出了单个全数字参数,psql 假设它是一个行号,而不是文件名。

提示

请参阅下面关于 环境 的内容,了解如何配置和自定义编辑器。

\echo text [ ... ] #

将计算后的参数打印到标准输出,用空格隔开,并在最后加上换行符。这对于在脚本输出中插入信息很有用。例如

=> \echo `date`
Tue Oct 26 21:40:57 CEST 1999

如果第一个参数是未引用的 -n,则不会写入尾随换行符(第一个参数也不会写入)。

提示

如果您使用 \o 命令重定向查询输出,您可能希望使用 \qecho 而不是此命令。另请参阅 \warn

\ef [ function_description [ line_number ] ] #

此命令获取并编辑命名函数或过程的定义,形式为 CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE 命令。编辑方式与 \edit 相同。如果您在未保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,并且您在其中添加了分号,则更新后的命令将立即执行。否则,它将被重新显示;键入分号或 \g 发送它,或 \r 取消它。

目标函数可以通过名称单独指定,也可以通过名称和参数指定,例如 foo(integer, text)。如果有多个同名的函数,则必须给出参数类型。

如果没有指定函数,将显示一个空白的 CREATE FUNCTION 模板供编辑。

如果指定了行号,psql 将把光标定位在函数体的指定行上。(请注意,函数体通常不会从文件的第一行开始。)

与大多数其他元命令不同,该行的其余部分始终被视为 \ef 的参数,并且在参数中不会执行变量插值或反引号展开。

提示

请参阅下面关于 环境 的内容,了解如何配置和自定义编辑器。

\encoding [ encoding ] #

设置客户端字符集编码。如果没有参数,此命令将显示当前编码。

\errverbose #

以最大详细程度重复最近的服务器错误消息,就像 VERBOSITY 被设置为 verbose 并且 SHOW_CONTEXT 被设置为 always 一样。

\ev [ view_name [ line_number ] ] #

此命令获取并编辑命名视图的定义,形式为 CREATE OR REPLACE VIEW 命令。编辑方式与 \edit 相同。如果您在未保存的情况下退出编辑器,则该语句将被丢弃。如果您保存并退出编辑器,并且您在其中添加了分号,则更新后的命令将立即执行。否则,它将被重新显示;键入分号或 \g 发送它,或 \r 取消它。

如果没有指定视图,将显示一个空白的 CREATE VIEW 模板供编辑。

如果指定了行号,psql 将把光标定位在视图定义的指定行上。

与大多数其他元命令不同,该行的其余部分始终被视为 \ev 的参数,并且在参数中不会执行变量插值或反引号展开。

\f [ string ] #

设置未对齐查询输出的字段分隔符。默认值为竖线 (|)。它等效于 \pset fieldsep

\g [ (option=value [...]) ] [ filename ]
\g [ (option=value [...]) ] [ |command ] #

将当前查询缓冲区发送到服务器以执行。

如果在 \g 之后出现括号,它们将包围一个空格分隔的 option=value 格式化选项子句列表,这些子句的解释方式与 \pset option value 命令相同,但仅在此查询期间生效。在此列表中,在 = 符号周围不允许使用空格,但在选项子句之间需要使用空格。如果省略 =value,则命名 option 的更改方式与 \pset option 类似,没有显式的 value

如果给出了 filename|command 参数,则查询的输出将写入命名文件或通过管道传递给给定的 shell 命令,而不是像往常一样显示它。只有在查询成功返回零个或多个元组时才会写入文件或命令,如果查询失败或是非数据返回的 SQL 命令,则不会写入。

如果当前查询缓冲区为空,则将重新执行最近发送的查询。除了这种行为之外,没有参数的 \g 本质上等效于分号。带有参数的 \g一次性 提供了 \o 命令的替代方案,此外还允许对由 \pset 通常设置的输出格式选项进行一次性调整。

当最后一个参数以 | 开头时,该行的剩余部分将被视为要执行的 command,并且在其中不会执行变量插值或反引号展开。该行的剩余部分将被简单地按字面传递给 shell。

\gdesc #

显示当前查询缓冲区结果的描述(即,列名和数据类型)。查询不会实际执行;但是,如果它包含某种类型的语法错误,则会以正常方式报告该错误。

如果当前查询缓冲区为空,则将描述最近发送的查询。

\getenv psql_var env_var #

获取环境变量 env_var 的值,并将其分配给 psql 变量 psql_var。如果 env_varpsql 进程的环境中未定义,则 psql_var 不会更改。例如

=> \getenv home HOME
=> \echo :home
/home/postgres
\gexec #

将当前查询缓冲区发送到服务器,然后将查询输出的每一行的每一列(如果有)都视为要执行的 SQL 语句。例如,要为 my_table 的每一列创建索引

=> SELECT format('create index on my_table(%I)', attname)
-> FROM pg_attribute
-> WHERE attrelid = 'my_table'::regclass AND attnum > 0
-> ORDER BY attnum
-> \gexec
CREATE INDEX
CREATE INDEX
CREATE INDEX
CREATE INDEX

生成的查询按返回行的顺序执行,如果有多列,则在每行内从左到右执行。忽略 NULL 字段。生成的查询将按字面发送到服务器进行处理,因此它们不能是 psql 元命令,也不能包含 psql 变量引用。如果任何单个查询失败,则除非设置了 ON_ERROR_STOP,否则将继续执行剩余的查询。每个查询的执行都受 ECHO 处理的约束。(在使用 \gexec 时,通常建议将 ECHO 设置为 allqueries。)查询记录、单步模式、计时和其他查询执行功能也适用于每个生成的查询。

如果当前查询缓冲区为空,则将重新执行最近发送的查询。

\gset [ prefix ] #

将当前查询缓冲区发送到服务器,并将查询的输出存储到 psql 变量中(请参阅下面关于 变量 的内容)。要执行的查询必须返回恰好一行。该行的每一列都存储到一个单独的变量中,其名称与该列相同。例如

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset
=> \echo :var1 :var2
hello 10

如果您指定了一个 prefix,则该字符串将被附加到查询的列名之前,以创建要使用的变量名

=> SELECT 'hello' AS var1, 10 AS var2
-> \gset result_
=> \echo :result_var1 :result_var2
hello 10

如果列结果为 NULL,则对应的变量将被取消设置,而不是被设置。

如果查询失败或没有返回一行,则不会更改任何变量。

如果当前查询缓冲区为空,则将重新执行最近发送的查询。

\gx [ (option=value [...]) ] [ filename ]
\gx [ (option=value [...]) ] [ |command ] #

\gx 等效于 \g,区别在于它强制在此查询中使用扩展输出模式,就像 expanded=on 包含在 \pset 选项列表中一样。另请参阅 \x

\h\help [ command ] #

提供关于指定SQL命令的语法帮助。如果没有指定 command,则 psql 将列出所有可以使用语法帮助的命令。如果 command 是星号 (*),则将显示所有SQL命令的语法帮助。

与大多数其他元命令不同,整行剩余部分始终被视为\help的参数,并且在参数中不执行变量插值或反引号扩展。

注意

为了简化输入,由多个单词组成的命令不需要用引号括起来。因此,输入\help alter table是完全可以的。

\H\html #

启用HTML查询输出格式。如果HTML格式已经启用,它将切换回默认的对齐文本格式。此命令是为了兼容性和便利性,但有关设置其他输出选项,请参阅\pset

\i\include filename #

从文件filename读取输入,并将其作为从键盘上输入的内容执行。

如果filename-(连字符),则从标准输入读取,直到遇到 EOF 指示或\q元命令。这可用于将交互式输入与来自文件中的输入穿插起来。请注意,只有在最外层级别处于活动状态时,才会使用 Readline 行为。

注意

如果希望在读取时将行显示在屏幕上,则必须将变量ECHO设置为all

\if expression
\elif expression
\else
\endif #

此命令组实现了可嵌套的条件块。条件块必须以\if开头,并以\endif结尾。在它们之间,可以包含任意数量的\elif子句,这些子句可以选择性地后跟单个\else子句。普通查询和其他类型的反斜杠命令可以(通常也会)出现在构成条件块的命令之间。

\if\elif命令读取它们的 arguments(s),并将其作为布尔表达式进行评估。如果表达式结果为true,则处理继续正常进行;否则,将跳过行,直到遇到匹配的\elif\else\endif。一旦\if\elif测试成功,则同一个块中后面的\elif命令的参数不会被评估,而是被视为假。只有在前面的匹配\if\elif没有成功的情况下,才会处理\else后面的行。

\if\elif命令的expression参数会受到变量插值和反引号扩展的影响,就像任何其他反斜杠命令参数一样。之后,它将像开/关选项变量的值一样进行评估。因此,有效值为任何与以下内容之一无歧义地匹配的无大小写匹配:truefalse10onoffyesno。例如,tTtR都将被视为true

不能正确评估为真或假的表达式将生成警告,并被视为假。

被跳过的行将被正常解析以识别查询和反斜杠命令,但查询不会发送到服务器,并且除条件命令(\if\elif\else\endif)之外的反斜杠命令将被忽略。条件命令只检查有效嵌套。跳过行中的变量引用不会被扩展,反引号扩展也不会执行。

给定条件块中的所有反斜杠命令都必须出现在同一个源文件中。如果在所有本地\if块关闭之前,在主输入文件或\include的文件中遇到 EOF,那么psql将引发错误。

以下是一个示例

-- check for the existence of two separate records in the database and store
-- the results in separate psql variables
SELECT
    EXISTS(SELECT 1 FROM customer WHERE customer_id = 123) as is_customer,
    EXISTS(SELECT 1 FROM employee WHERE employee_id = 456) as is_employee
\gset
\if :is_customer
    SELECT * FROM customer WHERE customer_id = 123;
\elif :is_employee
    \echo 'is not a customer but is an employee'
    SELECT * FROM employee WHERE employee_id = 456;
\else
    \if yes
        \echo 'not a customer or employee'
    \else
        \echo 'this will never print'
    \endif
\endif
\ir\include_relative filename #

\ir命令类似于\i,但对相对文件名的解析方式不同。在交互模式下执行时,这两个命令的行为完全相同。但是,当从脚本中调用时,\ir会将文件名解释为相对于脚本所在的目录,而不是相对于当前工作目录。

\l[+]\list[+] [ pattern ] #

列出服务器中的数据库,并显示它们的名称、所有者、字符集编码和访问权限。如果指定了pattern,则只列出名称与模式匹配的数据库。如果在命令名称后面附加+,则还会显示数据库大小、默认表空间和描述。(只有当前用户可以连接到的数据库才提供大小信息。)

\lo_export loid filename #

读取具有OID loid的数据库中的大型对象,并将其写入filename。请注意,这与服务器函数lo_export略有不同,后者以数据库服务器运行的用户身份,并在服务器的文件系统上执行操作。

提示

使用\lo_list来查找大型对象的OID.

\lo_import filename [ comment ] #

将文件存储到 PostgreSQL 大型对象中。可以选择性地将给定注释与对象关联。示例

foo=> \lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801

响应表明大型对象接收了对象 ID 152801,该 ID 可用于将来访问新创建的大型对象。为了提高可读性,建议始终将人类可读的注释与每个对象关联。可以使用\lo_list命令查看 OID 和注释。

请注意,此命令与服务器端lo_import略有不同,因为它以本地用户身份在本地文件系统上执行操作,而不是以服务器用户身份在服务器文件系统上执行操作。

\lo_list[+] #

显示当前存储在数据库中的所有 PostgreSQL 大型对象的列表,以及为它们提供的任何注释。如果在命令名称后面附加+,则每个大型对象都将与其关联的权限(如果有)一起列出。

删除具有OID loid的数据库中的大型对象。

提示

使用\lo_list来查找大型对象的OID.

\o\out [ filename ]
\o\out [ |command ] #

安排将未来的查询结果保存到文件filename或将未来的结果管道到 shell 命令command。如果没有指定参数,则查询输出将重置为标准输出。

如果参数以|开头,则整行剩余部分被视为要执行的command,并且不会在其中执行变量插值或反引号扩展。剩余部分将直接传递给 shell。

查询结果包括从数据库服务器获取的所有表、命令响应和通知,以及查询数据库的各种反斜杠命令(如\d)的输出;但不包括错误消息。

提示

要在查询结果之间穿插文本输出,请使用\qecho

\p\print #

将当前查询缓冲区打印到标准输出。如果当前查询缓冲区为空,则改为打印最近执行的查询。

\password [ username ] #

更改指定用户的密码(默认情况下,是当前用户)。此命令会提示输入新密码,对其进行加密,并将其作为ALTER ROLE命令发送到服务器。这确保新密码不会以明文形式出现在命令历史记录、服务器日志或其他地方。

\prompt [ text ] name #

提示用户提供文本,该文本将分配给变量name。可以指定可选的提示字符串text。(对于多词提示,请将文本用单引号括起来。)

默认情况下,\prompt使用终端进行输入和输出。但是,如果使用了-f命令行开关,\prompt将使用标准输入和标准输出。

\pset [ option [ value ] ] #

此命令设置影响查询结果表输出的选项。option指示要设置哪个选项。value的语义根据选择的选项而有所不同。对于某些选项,省略value会导致选项被切换或取消设置,如特定选项下所述。如果没有提到这种行为,那么省略value只会导致显示当前设置。

没有任何参数的\pset将显示所有打印选项的当前状态。

可调整的打印选项是

border #

value必须是一个数字。通常情况下,数字越大,表格的边框和线条就越多,但具体细节取决于特定的格式。在HTML格式中,这将直接转换为border=...属性。在大多数其他格式中,只有值 0(无边框)、1(内部分隔线)和 2(表格框架)才有意义,而大于 2 的值将被视为与border = 2相同。latexlatex-longtable格式还允许值为 3,以在数据行之间添加分隔线。

columns #

设置 wrapped 格式的目标宽度,以及用于确定输出是否足够宽以需要分页或在扩展自动模式下切换到垂直显示的宽度限制。零(默认值)会导致目标宽度由环境变量 COLUMNS 控制,或者如果未设置 COLUMNS,则由检测到的屏幕宽度控制。此外,如果 columns 为零,则 wrapped 格式仅影响屏幕输出。如果 columns 不为零,则文件和管道输出也将包装到该宽度。

csv_fieldsep #

指定在CSV输出格式中使用的字段分隔符。如果分隔符字符出现在字段的值中,则该字段将在双引号中输出,遵循标准CSV规则。默认值为逗号。

expanded(或 x #

如果指定了 value,它必须是 onoff,这将启用或禁用扩展模式,或 auto。如果省略了 value,则该命令在打开和关闭设置之间切换。启用扩展模式时,查询结果将显示在两列中,左侧为列名,右侧为数据。如果数据在正常 水平 模式下无法容纳在屏幕上,此模式很有用。在自动设置中,每当查询输出具有多于一列并且比屏幕宽时,就会使用扩展模式;否则,将使用常规模式。自动设置仅在对齐和包装格式中有效。在其他格式中,它始终表现得好像扩展模式已关闭。

fieldsep #

指定在未对齐输出格式中使用的字段分隔符。这样就可以创建例如制表符分隔的输出,其他程序可能更喜欢这种输出。要将制表符设置为字段分隔符,请键入 \pset fieldsep '\t'。默认字段分隔符为 '|'(垂直线)。

fieldsep_zero #

将未对齐输出格式中使用的字段分隔符设置为零字节。

如果指定了 value,它必须是 onoff,这将启用或禁用显示表页脚((n rows) 计数)。如果省略了 value,则该命令在启用或禁用页脚显示之间切换。

format #

将输出格式设置为以下格式之一:alignedasciidoccsvhtmllatexlatex-longtabletroff-msunalignedwrapped。允许使用唯一缩写。

aligned 格式是标准的、人类可读的、格式良好的文本输出;这是默认值。

unaligned 格式将一行中的所有列写入一行,用当前活动的字段分隔符分隔。这对创建可能用于其他程序读取的输出很有用,例如制表符分隔或逗号分隔格式。但是,如果字段分隔符字符出现在列的值中,则不会对其进行特殊处理;所以CSV格式可能更适合此类用途。

csv 格式 写入以逗号分隔的列值,应用 RFC 4180 中描述的引用规则。此输出与服务器 COPY 命令的 CSV 格式兼容。除非 tuples_only 参数为 on,否则将生成带有列名的标题行。标题和页脚不会打印。每行都以系统相关的行结束符终止,该结束符通常对于类 Unix 系统是单个换行符 (\n),或者对于 Microsoft Windows 是回车换行序列 (\r\n)。可以使用 \pset csv_fieldsep 选择除逗号以外的字段分隔符字符。

wrapped 格式类似于 aligned,但它将宽数据值跨行包装,以使输出适合目标列宽度。目标宽度按 columns 选项中所述确定。请注意,psql 不会尝试包装列标题;因此,如果用于列标题的总宽度超过目标,则 wrapped 格式的行为与 aligned 相同。

The asciidoc, html, latex, latex-longtable, and troff-ms formats output tables that are intended to be included in documents using the respective mark-up language. They are not complete documents! This might not be necessary inHTML, but in LaTeX you must have a complete document wrapper. The latex format uses LaTeX's tabular environment. The latex-longtable format requires the LaTeX longtable and booktabs packages.

linestyle #

将边框线绘制样式设置为以下之一:asciiold-asciiunicode。允许使用唯一缩写。(这意味着一个字母就足够了。)默认设置为 ascii。此选项仅影响 alignedwrapped 输出格式。

ascii 样式使用普通ASCII字符。数据中的换行符使用 + 符号显示在右边缘。当 wrapped 格式将数据从一行包装到下一行而没有换行符时,在第一行的右边缘会显示一个点 (.),并且在下一行的左边缘也会再次显示。

old-ascii 样式使用普通ASCII字符,使用 PostgreSQL 8.4 及更早版本中使用的格式样式。数据中的换行符使用 : 符号代替左边的列分隔符显示。当数据在没有换行符的情况下从一行包装到下一行时,使用 ; 符号代替左边的列分隔符。

unicode 样式使用 Unicode 边框绘制字符。数据中的换行符使用回车符号显示在右边缘。当数据在没有换行符的情况下从一行包装到下一行时,在第一行的右边缘会显示省略号符号,并且在下一行的左边缘也会再次显示。

border 设置大于零时,linestyle 选项还决定用于绘制边框线的字符。普通ASCII字符在任何地方都适用,但 Unicode 字符在识别它们的显示器上看起来更美观。

null #

设置用于代替空值打印的字符串。默认情况下不打印任何内容,这很容易与空字符串混淆。例如,人们可能更喜欢 \pset null '(null)'

numericlocale #

如果指定了 value,它必须是 onoff,这将启用或禁用显示特定于区域设置的字符以分隔小数点标记左侧的数字组。如果省略了 value,则该命令在常规数字输出和特定于区域设置的数字输出之间切换。

pager #

控制是否对查询和 psql 帮助输出使用分页程序。当 pager 选项为 off 时,不会使用分页程序。当 pager 选项为 on 时,分页程序会在适当的时候使用,即当输出到终端并且无法容纳在屏幕上时。pager 选项也可以设置为 always,这会导致分页程序用于所有终端输出,无论其是否适合屏幕。没有 value\pset pager 在启用和禁用分页程序之间切换。

如果环境变量 PSQL_PAGERPAGER 已设置,则将要分页的输出传递给指定的程序。否则,将使用特定于平台的默认程序(例如 more)。

当使用 \watch 命令重复执行查询时,环境变量 PSQL_WATCH_PAGER 用于在 Unix 系统上查找分页程序。这是单独配置的,因为它可能会混淆传统的分页程序,但可用于将输出发送到理解 psql 输出格式的工具(例如 pspg --stream)。

pager_min_lines #

如果 pager_min_lines 设置为大于页面高度的数字,则除非至少有这么多行输出要显示,否则不会调用分页程序。默认设置为 0。

recordsep #

指定在未对齐输出格式中使用的记录(行)分隔符。默认值为换行符。

recordsep_zero #

将未对齐输出格式中使用的记录分隔符设置为零字节。

tableattr(或 T #

HTML格式中,这指定要放置在 table 标签内的属性。这可能是例如 cellpaddingbgcolor。请注意,您可能不想在此处指定 border,因为 \pset border 已经处理了它。如果未给出 value,则表属性将被取消设置。

latex-longtable 格式中,这控制包含左对齐数据类型的每列的比例宽度。它被指定为一个空格分隔的值列表,例如 '0.2 0.2 0.6'。未指定的输出列使用最后指定的值。

title(或 C #

为随后打印的任何表格设置表格标题。这可用于为输出提供描述性标签。如果未给出 value,则标题将被取消设置。

tuples_only(或 t #

如果指定了 value,它必须是 onoff,这将启用或禁用仅元组模式。如果省略了 value,则该命令在常规输出和仅元组输出之间切换。常规输出包括额外的信息,例如列标题、标题和各种页脚。在仅元组模式下,仅显示实际的表数据。

unicode_border_linestyle #

设置 unicode 线性样式的边框绘制样式为 singledouble 之一。

unicode_column_linestyle #

设置 unicode 线性样式的列绘制样式为 singledouble 之一。

unicode_header_linestyle #

设置 unicode 线性样式的标题绘制样式为 singledouble 之一。

xheader_width #

将扩展输出标题的最大宽度设置为 full(默认值)、columnpageinteger value

full:扩展标题不会被截断,并且将与最宽的输出行一样宽。

column:将标题行截断为第一列的宽度。

page:将标题行截断为终端宽度。

integer value:指定标题行的确切最大宽度。

这些不同格式的外观示例可以在下面的 示例 中看到。

提示

对于 \pset,有各种快捷命令。参见 \a\C\f\H\t\T\x

\q\quit #

退出 psql 程序。在脚本文件中,只终止该脚本的执行。

\qecho text [ ... ] #

此命令与 \echo 相同,只是输出将被写入查询输出通道,如 \o 所设置。

\r\reset #

重置(清除)查询缓冲区。

\s [ filename ] #

psql 的命令行历史记录打印到 filename。如果省略 filename,则历史记录将被写入标准输出(如果适用,则使用分页程序)。如果 psql 在没有 Readline 支持的情况下构建,则此命令不可用。

\set [ name [ value [ ... ] ] ] #

psql 变量 name 设置为 value,或者如果给出了多个值,则设置为所有值的串联。如果只给出一个参数,则变量被设置为一个空字符串值。要取消设置变量,请使用 \unset 命令。

\set 不带任何参数,将显示所有当前设置的 psql 变量的名称和值。

有效的变量名可以包含字母、数字和下划线。有关详细信息,请参见下面的 变量。变量名区分大小写。

某些变量是特殊的,因为它们控制 psql 的行为或自动设置为反映连接状态。这些变量在下面 变量 中有说明。

注意

此命令与SQL命令 SET 无关。

\setenv name [ value ] #

将环境变量 name 设置为 value,或者如果未提供 value,则取消设置环境变量。例如

testdb=> \setenv PAGER less
testdb=> \setenv LESS -imx4F
\sf[+] function_description #

此命令获取并显示命名函数或过程的定义,以 CREATE OR REPLACE FUNCTIONCREATE OR REPLACE PROCEDURE 命令的形式。定义将被打印到当前的查询输出通道,如 \o 所设置。

目标函数可以通过名称单独指定,也可以通过名称和参数指定,例如 foo(integer, text)。如果有多个同名的函数,则必须给出参数类型。

如果在命令名称后面附加 +,则输出行将被编号,函数体的第一行将为第 1 行。

与大多数其他元命令不同,该行的所有剩余部分始终被视为 \sf 的参数,并且在参数中不执行变量插值或反引号扩展。

\sv[+] view_name #

此命令获取并显示命名视图的定义,以 CREATE OR REPLACE VIEW 命令的形式。定义将被打印到当前的查询输出通道,如 \o 所设置。

如果在命令名称后面附加 +,则输出行将从 1 开始编号。

与大多数其他元命令不同,该行的所有剩余部分始终被视为 \sv 的参数,并且在参数中不执行变量插值或反引号扩展。

\t #

切换输出列名称标题和行计数页脚的显示。此命令等效于 \pset tuples_only,为了方便提供。

\T table_options #

指定要放在 table 标签中的属性HTML输出格式。此命令等效于 \pset tableattr table_options

\timing [ on | off ] #

使用参数,打开或关闭显示每个 SQL 语句需要多长时间。不带参数,在打开和关闭之间切换显示。显示以毫秒为单位;超过 1 秒的间隔也以分钟:秒的格式显示,并在需要时添加小时和天数字段。

\unset name #

取消设置(删除)psql 变量 name

大多数控制 psql 行为的变量无法取消设置;相反,\unset 命令被解释为将它们设置为默认值。请参见下面的 变量

\w\write filename
\w\write |command #

将当前查询缓冲区写入文件 filename 或将其管道传输到 shell 命令 command。如果当前查询缓冲区为空,则写入最近执行的查询。

如果参数以|开头,则整行剩余部分被视为要执行的command,并且不会在其中执行变量插值或反引号扩展。剩余部分将直接传递给 shell。

\warn text [ ... ] #

此命令与 \echo 相同,只是输出将被写入 psql 的标准错误通道,而不是标准输出。

\watch [ i[nterval]=seconds ] [ c[ount]=times ] [ m[in_rows]=rows ] [ seconds ] #

反复执行当前查询缓冲区(如 \g 所做的那样),直到中断,或查询失败,或达到执行计数限制(如果给出),或查询不再返回最少数量的行。在每次执行之间等待指定秒数(默认值为 2)。为了向后兼容,seconds 可以带有或不带有 interval= 前缀指定。每个查询结果都显示一个标题,其中包含 \pset title 字符串(如果有),查询开始的时间以及延迟间隔。

如果当前查询缓冲区为空,则将重新执行最近发送的查询。

\x [ on | off | auto ] #

设置或切换扩展表格格式模式。因此,它等效于 \pset expanded

\z[S] [ pattern ] #

列出表、视图和序列及其关联的访问权限。如果指定了 pattern,则仅列出名称与模式匹配的表、视图和序列。默认情况下,只显示用户创建的对象;提供模式或 S 修饰符以包含系统对象。

这是 \dp(“显示权限”)的别名。

\! [ command ] #

不带参数,转义到子 shell;psql 在子 shell 退出时恢复。带参数,执行 shell 命令 command

与大多数其他元命令不同,该行的所有剩余部分始终被视为 \! 的参数,并且在参数中不执行变量插值或反引号扩展。该行的其余部分只是简单地按字面意思传递给 shell。

\? [ topic ] #

显示帮助信息。可选的 topic 参数(默认为 commands)选择解释 psql 的哪一部分:commands 描述 psql 的反斜杠命令;options 描述可以传递给 psql 的命令行选项;variables 显示有关 psql 配置变量的帮助。

\; #

反斜杠分号不是与前面的命令相同的元命令;相反,它只是简单地在查询缓冲区中添加一个分号,而不进行任何进一步的处理。

通常,psql 将在到达命令结束的分号时立即将 SQL 命令分派到服务器,即使当前行上有更多输入。因此,例如输入

select 1; select 2; select 3;

将导致三个 SQL 命令被单独发送到服务器,每个命令的结果将在继续执行下一个命令之前显示。但是,作为 \; 输入的分号不会触发命令处理,因此它之前的命令和之后的命令实际上会组合在一起,并作为单个请求发送到服务器。所以例如

select 1\; select 2\; select 3;

当遇到非反斜杠分号时,会将三个 SQL 命令作为单个请求发送到服务器。服务器将此类请求作为单个事务执行,除非字符串中包含显式的 BEGIN/COMMIT 命令将其划分为多个事务。(有关服务器如何处理多查询字符串的更多详细信息,请参阅 第 53.2.2.1 节。)

模式

各种 \d 命令接受一个 pattern 参数来指定要显示的对象名称。在最简单的情况下,模式只是对象的精确名称。模式中的字符通常会折叠为小写,就像 SQL 名称一样;例如,\dt FOO 将显示名为 foo 的表。与 SQL 名称一样,在模式周围放置双引号将停止折叠为小写。如果您需要在模式中包含实际的双引号字符,请将其写为双引号序列中的双引号对;这同样符合 SQL 引号标识符的规则。例如,\dt "FOO""BAR" 将显示名为 FOO"BAR(而不是 foo"bar)的表。与 SQL 名称的常规规则不同,您可以在模式的一部分周围放置双引号,例如 \dt FOO"FOO"BAR 将显示名为 fooFOObar 的表。

每当完全省略 pattern 参数时,\d 命令都会显示当前模式搜索路径中可见的所有对象 - 这等同于使用 * 作为模式。(如果对象包含的模式在搜索路径中,并且在搜索路径中没有出现相同类型和名称的对象,则该对象被称为 可见。这等同于该对象可以通过名称引用而无需显式模式限定的说法。)若要查看数据库中的所有对象,无论其可见性如何,请使用 *.* 作为模式。

在模式中,* 匹配任何字符序列(包括无字符),而 ? 匹配任何单个字符。(此表示法类似于 Unix shell 文件名模式。)例如,\dt int* 显示名称以 int 开头的表。但在双引号内,*? 会失去这些特殊含义,并且仅按字面意义匹配。

包含点 (.) 的关系模式被解释为模式名称模式后跟对象名称模式。例如,\dt foo*.*bar* 显示模式名称以 foo 开头的模式中的所有表,这些表的表名包含 bar。当没有出现点时,模式只匹配当前模式搜索路径中可见的对象。同样,双引号内的点会失去其特殊含义,并按字面意义匹配。包含两个点 (.) 的关系模式被解释为数据库名称后跟模式名称模式后跟对象名称模式。数据库名称部分不会被视为模式,必须与当前连接的数据库的名称匹配,否则会引发错误。

包含点 (.) 的模式模式被解释为数据库名称后跟模式名称模式。例如,\dn mydb.*foo* 显示所有模式名称包含 foo 的模式。数据库名称部分不会被视为模式,必须与当前连接的数据库的名称匹配,否则会引发错误。

高级用户可以使用正则表达式表示法,例如字符类,例如 [0-9] 匹配任何数字。所有正则表达式特殊字符的运作方式如 第 9.7.3 节 中所述,但 . 除外,它被用作上述分隔符,* 被转换为正则表达式表示法 .*? 被转换为 .,而 $ 则按字面意义匹配。如果需要,您可以通过编写 ? 来模拟这些模式字符来代替 .(R+|) 来代替 R*,或者 (R|) 来代替 R?$ 不需要作为正则表达式字符,因为模式必须匹配整个名称,这与正则表达式的通常解释不同(换句话说,$ 会自动附加到您的模式)。如果您不希望模式被锚定,请在开头和/或结尾处编写 *。请注意,在双引号内,所有正则表达式特殊字符都会失去其特殊含义,并且按字面意义匹配。此外,操作符名称模式中的正则表达式特殊字符也按字面意义匹配(即 \do 的参数)。

高级功能

变量

psql 提供类似于常见 Unix 命令 shell 的变量替换功能。变量只是名称/值对,其中值可以是任何长度的任何字符串。名称必须由字母(包括非拉丁字母)、数字和下划线组成。

要设置变量,请使用 psql 元命令 \set。例如,

testdb=> \set foo bar

将变量 foo 设置为值 bar。要检索变量的内容,请在名称之前加上冒号,例如

testdb=> \echo :foo
bar

这在常规 SQL 命令和元命令中都有效;在下面 SQL 插值 中有更多详细信息。

如果您在没有第二个参数的情况下调用 \set,则变量将设置为空字符串值。要取消设置(即删除)变量,请使用命令 \unset。若要显示所有变量的值,请在不带任何参数的情况下调用 \set

注意

与其他命令一样,\set 的参数也受相同的替换规则约束。因此,您可以构建有趣的引用,例如 \set :foo 'something',并获得 软链接变量变量,分别来自 PerlPHP。不幸的是(或幸运的是?),没有办法对这些构造做任何有用的事情。另一方面,\set bar :foo 是复制变量的有效方法。

psql 特殊对待许多这些变量。它们代表某些选项设置,这些设置可以通过更改变量的值在运行时进行更改,或者在某些情况下代表 psql 的可更改状态。按照惯例,所有特殊处理变量的名称都由所有大写 ASCII 字母(以及可能的数字和下划线)组成。为了确保将来最大程度的兼容性,请避免将此类变量名称用于您自己的目的。

控制 psql 行为的变量通常无法取消设置或设置为无效值。允许使用 \unset 命令,但它被解释为将变量设置为其默认值。不带第二个参数的 \set 命令被解释为将变量设置为 on,对于接受该值的控制变量,对于其他变量则被拒绝。此外,接受 onoff 值的控制变量还将接受布尔值的其他常见拼写,例如 truefalse

特殊处理的变量是

AUTOCOMMIT #

当设置为 on(默认值)时,每个 SQL 命令在成功完成时都会自动提交。若要在此模式下推迟提交,您必须输入 BEGINSTART TRANSACTION SQL 命令。当设置为 off 或取消设置时,SQL 命令不会提交,直到您明确发出 COMMITEND。自动提交关闭模式的工作原理是为您发出隐式的 BEGIN,就在任何尚未在事务块中的命令之前,并且它本身不是 BEGIN 或其他事务控制命令,也不是无法在事务块内执行的命令(例如 VACUUM)。

注意

在自动提交关闭模式下,您必须通过输入 ABORTROLLBACK 来明确放弃任何失败的事务。另外请记住,如果您在提交之前退出会话,您的工作将会丢失。

注意

自动提交开启模式是 PostgreSQL 的传统行为,但自动提交关闭模式更接近 SQL 规范。如果您更喜欢自动提交关闭模式,您可能希望在系统范围的 psqlrc 文件或您的 ~/.psqlrc 文件中设置它。

COMP_KEYWORD_CASE #

确定在完成 SQL 关键字时使用哪个字母大小写。如果设置为 lowerupper,则完成的单词将分别为小写或大写。如果设置为 preserve-lowerpreserve-upper(默认值),则完成的单词将与已输入的单词的大小写相同,但未输入任何内容的单词将分别为小写或大写。

DBNAME #

您当前连接的数据库的名称。每次连接到数据库(包括程序启动)时都会设置它,但可以更改或取消设置它。

ECHO #

如果设置为 all,所有非空输入行都会在读取时被打印到标准输出。(这并不适用于交互式读取的行。)若要选择在程序启动时使用此行为,请使用开关 -a。如果设置为 queriespsql 会在将每个查询发送到服务器时将其打印到标准输出。选择此行为的开关是 -e。如果设置为 errors,则只会在标准错误输出上显示失败的查询。此行为的开关是 -b。如果设置为 none(默认值),则不会显示任何查询。

ECHO_HIDDEN #

当此变量设置为 on 并且反斜杠命令查询数据库时,会首先显示该查询。此功能有助于您研究 PostgreSQL 内部结构并在自己的程序中提供类似的功能。(若要选择在程序启动时使用此行为,请使用开关 -E。)如果您将此变量设置为值 noexec,则只会显示查询,但实际上不会发送到服务器并执行。默认值为 off

ENCODING #

当前客户端字符集编码。每次连接到数据库(包括程序启动)以及使用 \encoding 更改编码时都会设置它,但可以更改或取消设置它。

ERROR #

如果最后一个 SQL 查询失败,则为 true;如果成功,则为 false。另请参见 SQLSTATE

FETCH_COUNT #

如果此变量设置为大于零的整数值,则 SELECT 查询的结果将以该行数为一组进行提取和显示,而不是默认行为(即在显示之前收集整个结果集)。因此,无论结果集的大小如何,都只会使用有限的内存。启用此功能时,通常使用 100 到 1000 的设置。请记住,在使用此功能时,查询可能在已显示某些行后失败。

提示

虽然您可以将任何输出格式与此功能一起使用,但默认的 aligned 格式往往看起来很糟糕,因为每组 FETCH_COUNT 行将分别进行格式化,导致行组之间的列宽不同。其他输出格式效果更好。

HIDE_TABLEAM #

如果此变量设置为 true,则不会显示表的访问方法详细信息。这主要用于回归测试。

HIDE_TOAST_COMPRESSION #

如果此变量设置为 true,则不会显示列压缩方法详细信息。这主要用于回归测试。

HISTCONTROL #

如果此变量设置为 ignorespace,则以空格开头的行不会被输入历史记录列表。如果设置为 ignoredups,则与上一个历史记录行匹配的行不会被输入。值 ignoreboth 将这两个选项结合在一起。如果设置为 none(默认值),则在交互模式下读取的所有行都将保存在历史记录列表中。

注意

此功能是明目张胆地从 Bash 中剽窃的。

HISTFILE #

将用于存储历史记录列表的文件名。如果未设置,则文件名将从 PSQL_HISTORY 环境变量中获取。如果该变量也未设置,则默认值为 ~/.psql_history 或 Windows 上的 %APPDATA%\postgresql\psql_history。例如,将

\set HISTFILE ~/.psql_history-:DBNAME

放入 ~/.psqlrc 中将导致 psql 为每个数据库维护一个独立的历史记录。

注意

此功能是明目张胆地从 Bash 中剽窃的。

HISTSIZE #

要在命令历史记录中存储的命令的最大数量(默认值为 500)。如果设置为负值,则不应用限制。

注意

此功能是明目张胆地从 Bash 中剽窃的。

HOST #

您当前连接到的数据库服务器主机。每次连接到数据库(包括程序启动)时都会设置此变量,但可以更改或取消设置。

IGNOREEOF #

如果设置为 1 或更小,则将EOF字符(通常为 Control+D)发送到 psql 的交互式会话将终止应用程序。如果设置为更大的数值,则必须输入该数量的连续EOF字符才能使交互式会话终止。如果将变量设置为非数值,则将其解释为 10。默认值为 0。

注意

此功能是明目张胆地从 Bash 中剽窃的。

LASTOID #

最后一个受影响的 OID 的值,由 INSERT\lo_import 命令返回。此变量仅在显示下一个命令的结果之后才能保证有效。SQL从版本 12 开始,PostgreSQL 服务器不再支持 OID 系统列,因此在针对此类服务器时,INSERT 之后 LASTOID 将始终为 0。

LAST_ERROR_MESSAGE
LAST_ERROR_SQLSTATE #

当前 psql 会话中最新的失败查询的主要错误消息和关联的 SQLSTATE 代码,或者如果当前会话中没有发生错误,则为空字符串和 00000

ON_ERROR_ROLLBACK #

当设置为 on 时,如果事务块中的语句产生错误,则忽略该错误,并且事务继续进行。当设置为 interactive 时,此类错误仅在交互式会话中被忽略,而不在读取脚本文件时被忽略。当设置为 off(默认值)时,事务块中产生错误的语句将中止整个事务。错误回滚模式的工作原理是在每个位于事务块中的命令之前为您隐式发出一个 SAVEPOINT,如果命令失败,则回滚到该保存点。

ON_ERROR_STOP #

默认情况下,命令处理在发生错误后继续进行。当此变量设置为 on 时,处理将立即停止。在交互模式下,psql 将返回到命令提示符;否则,psql 将退出,返回错误代码 3 以区分这种情况与致命错误条件(使用错误代码 1 报告)。在这两种情况下,任何当前正在运行的脚本(顶级脚本(如果有)以及它可能调用的任何其他脚本)都将立即终止。如果顶级命令字符串包含多个 SQL 命令,则处理将停止当前命令。

PORT #

您当前连接到的数据库服务器端口。每次连接到数据库(包括程序启动)时都会设置此变量,但可以更改或取消设置。

PROMPT1
PROMPT2
PROMPT3 #

这些指定了 psql 发出的提示应该是什么样子。请参见下面的 Prompting

QUIET #

将此变量设置为 on 等同于命令行选项 -q。在交互模式下可能不太有用。

ROW_COUNT #

最后一个 SQL 查询返回或影响的行数,或者如果查询失败或未报告行数,则为 0。

SERVER_VERSION_NAME
SERVER_VERSION_NUM #

服务器的版本号,以字符串形式表示,例如 9.6.210.111beta1,以及以数字形式表示,例如 90602100001。每次连接到数据库(包括程序启动)时都会设置此变量,但可以更改或取消设置。

SHELL_ERROR #

如果最后一个 shell 命令失败,则为 true;如果成功,则为 false。这适用于通过 \!\g\o\w\copy 元命令以及反引号 (`) 扩展调用的 shell 命令。请注意,对于 \o,此变量在下一个 \o 命令关闭输出管道时更新。另请参见 SHELL_EXIT_CODE

SHELL_EXIT_CODE #

最后一个 shell 命令返回的退出状态。0-127 表示程序退出代码,128-255 表示信号终止,-1 表示启动程序或收集其退出状态失败。这适用于通过 \!\g\o\w\copy 元命令以及反引号 (`) 扩展调用的 shell 命令。请注意,对于 \o,此变量在下一个 \o 命令关闭输出管道时更新。另请参见 SHELL_ERROR

SHOW_ALL_RESULTS #

当此变量设置为 off 时,只会显示组合查询 (\;) 的最后一个结果,而不是所有结果。默认值为 on。off 行为是为了与旧版本的 psql 兼容。

SHOW_CONTEXT #

此变量可以设置为 nevererrorsalways,以控制是否在来自服务器的消息中显示 CONTEXT 字段。默认值为 errors(表示上下文将在错误消息中显示,但在通知或警告消息中不会显示)。当 VERBOSITY 设置为 tersesqlstate 时,此设置无效。(另请参见 \errverbose,用于在您想要查看刚发生的错误的详细版本时使用。)

SINGLELINE #

将此变量设置为 on 等同于命令行选项 -S

SINGLESTEP #

将此变量设置为 on 等同于命令行选项 -s

SQLSTATE #

与最后一个 SQL 查询失败相关的错误代码(请参见 Appendix A),或者如果成功,则为 00000

USER #

您当前以其身份连接的数据库用户。每次连接到数据库(包括程序启动)时都会设置此变量,但可以更改或取消设置。

VERBOSITY #

此变量可以设置为 defaultverbosetersesqlstate,以控制错误报告的详细程度。(另请参见 \errverbose,用于在您想要查看刚发生的错误的详细版本时使用。)

VERSION
VERSION_NAME
VERSION_NUM #

这些变量在程序启动时设置,以反映 psql 的版本,分别为详细字符串、简短字符串(例如 9.6.210.111beta1)和数字(例如 90602100001)。它们可以更改或取消设置。

SQL插值

psql 变量的一个关键特性是您可以将它们替换 (插值) 到常规的 SQL语句,以及元命令的参数。此外,psql 提供了确保用作 SQL 字面量和标识符的变量值被正确引用的功能。要插入不带引号的值的语法是在变量名前面加上冒号 (:)。例如,

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;

将查询表 my_table。请注意,这可能不安全:变量的值被逐字复制,因此它可能包含不平衡的引号,甚至反斜杠命令。您必须确保将其放在正确的位置。

当一个值要被用作 SQL 字面量或标识符时,最安全的做法是安排对其进行引用。要将变量的值引用为 SQL 字面量,请写一个冒号,然后在单引号中写上变量名。要将该值引用为 SQL 标识符,请写一个冒号,然后在双引号中写上变量名。这些结构会正确地处理嵌入在变量值内的引号和其他特殊字符。前面的例子可以更安全地这样写:

testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :"foo";

变量插值不会在引号内执行SQL字面量和标识符。因此,像 ':foo' 这样的结构不会从变量的值中生成一个带引号的字面量(即使它起作用也不安全,因为它不会正确地处理嵌入在该值中的引号)。

这种机制的一个应用例子是将文件的内容复制到一个表列中。首先将文件加载到一个变量中,然后将变量的值插值为一个带引号的字符串

testdb=> \set content `cat my_file.txt`
testdb=> INSERT INTO my_table VALUES (:'content');

(请注意,如果 my_file.txt 包含空字符,这仍然不起作用。 psql 不支持变量值中的嵌入空字符。)

由于冒号可以在 SQL 命令中合法地出现,因此一个明显的插值尝试(即,:name:'name':"name")只有在命名的变量当前被设置时才会被替换。在任何情况下,您可以使用反斜杠对冒号进行转义以防止其被替换。

:{?name} 特殊语法根据变量是否存在返回 TRUE 或 FALSE,因此始终会被替换,除非冒号被反斜杠转义。

变量的冒号语法是标准的SQL用于嵌入式查询语言,例如 ECPG。数组切片和类型转换的冒号语法是 PostgreSQL 扩展,它有时会与标准用法冲突。用冒号和引号转义变量的值作为 SQL 字面量或标识符的语法是 psql 的扩展。

提示

psql 发出的提示可以根据您的偏好进行定制。三个变量 PROMPT1PROMPT2PROMPT3 包含字符串和描述提示外观的特殊转义序列。提示 1 是当 psql 请求新命令时发出的正常提示。提示 2 是在命令输入期间需要更多输入时发出的,例如,因为命令没有以分号结尾或引号没有关闭。提示 3 是在您运行SQL COPY FROM STDIN 命令并且您需要在终端上输入行值时发出的。

所选提示变量的值被逐字打印,除非遇到百分号 (%)。根据下一个字符,某些其他文本将被替换。已定义的替换如下:

%M #

数据库服务器的完整主机名(包含域名),如果连接是通过 Unix 域套接字,则为 [local],如果 Unix 域套接字不在编译时的默认位置,则为 [local:/dir/name]

%m #

数据库服务器的主机名,在第一个点处截断,如果连接是通过 Unix 域套接字,则为 [local]

%> #

数据库服务器正在监听的端口号。

%n #

数据库会话用户名。(此值的扩展可能会在数据库会话期间发生变化,这是 SET SESSION AUTHORIZATION 命令的结果。)

%/ #

当前数据库的名称。

%~ #

%/ 相似,但如果数据库是您的默认数据库,则输出为 ~(波浪号)。

%# #

如果会话用户是数据库超级用户,则为 #,否则为 >。(此值的扩展可能会在数据库会话期间发生变化,这是 SET SESSION AUTHORIZATION 命令的结果。)

%p #

当前连接的后端的进程 ID。

%R #

在提示 1 中通常为 =,但在以下情况下为 @:会话位于条件块的非活动分支中,或在单行模式下,或在会话与数据库断开连接时(如果 \connect 失败,可能会发生这种情况)。在提示 2 中,%R 被替换为一个字符,该字符取决于 psql 为什么需要更多输入:如果命令没有终止,则为 -,但如果存在未完成的 /* ... */ 注释,则为 *,如果存在未完成的带引号的字符串,则为单引号,如果存在未完成的带引号的标识符,则为双引号,如果存在未完成的美元引号的字符串,则为美元符号,或者如果存在不匹配的左括号,则为 (。在提示 3 中,%R 不会产生任何内容。

%x #

事务状态:不在事务块中时为空字符串,在事务块中时为 *,在事务块失败时为 !,或者当事务状态不确定时(例如,因为没有连接)为 ?

%l #

当前语句中的行号,从 1 开始。

%digits #

将使用指示的八进制代码的字符进行替换。

%:name: #

psql 变量 name 的值。有关详细信息,请参见上面的 变量

%`command` #

command 的输出,类似于普通的 反引号 替换。

%[ ... %] #

提示可以包含终端控制字符,例如,更改提示文本的颜色、背景或样式,或更改终端窗口的标题。为了使 Readline 的行编辑功能正常工作,这些非打印控制字符必须被指定为不可见,方法是用 %[%] 将它们括起来。这些对可以在提示中多次出现。例如

testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%]%# '

在与 VT100 兼容的彩色终端上生成一个粗体(1;)黄底黑字(33;40)的提示。

%w #

PROMPT1 的最新输出宽度相同的空白。这可以用作 PROMPT2 设置,因此多行语句与第一行对齐,但没有可见的二级提示。

要在提示中插入百分号,请写 %%。默认提示为 '%/%R%x%# '(提示 1 和 2),以及 '>> '(提示 3)。

注意

此功能是厚颜无耻地从 tcsh 中剽窃来的。

命令行编辑

psql 使用 Readlinelibedit 库(如果可用),以方便地进行行编辑和检索。命令历史记录在 psql 退出时自动保存,并在 psql 启动时重新加载。键入向上箭头或 Control-P 以检索以前的命令行。

您还可以使用 Tab 键补全在许多(并非所有)情况下填入部分键入的关键字和 SQL 对象名称。例如,在命令开头,键入 ins 并按下 Tab 键将填入 insert into。然后,键入表或模式名称的几个字符并按下 TAB 键将填入未完成的名称,或者在有多个匹配项时提供一个可能的补全菜单。(根据所使用的库,您可能需要按多次 TAB 键才能获得菜单。)

对 SQL 对象名称的 Tab 键补全需要发送查询到服务器以查找可能的匹配项。在某些情况下,这会干扰其他操作。例如,在 BEGIN 之后,如果在两者之间发出一个 Tab 键补全查询,则发出 SET TRANSACTION ISOLATION LEVEL 将为时已晚。如果您根本不希望进行 Tab 键补全,则可以通过在您的主目录中名为 .inputrc 的文件中放入以下内容来永久关闭它

$if psql
set disable-completion on
$endif

(这不是 psql 功能,而是 Readline 功能。有关更多详细信息,请阅读其文档。)

-n (--no-readline) 命令行选项在单个 psql 运行期间禁用 Readline 的使用也很有用。这将阻止 Tab 键补全、使用或记录命令行历史记录以及多行命令的编辑。当您需要复制和粘贴包含 TAB 字符的文本时,它特别有用。

环境

COLUMNS #

如果 \pset columns 为零,则控制 wrapped 格式的宽度以及用于确定宽输出是否需要分页器或在扩展自动模式下应切换到垂直格式的宽度。

PGDATABASE
PGHOST
PGPORT
PGUSER #

默认连接参数(请参见 第 32.15 节)。

PG_COLOR #

指定是否在诊断消息中使用颜色。可能的值是 alwaysautonever

PSQL_EDITOR
EDITOR
VISUAL #

\e\ef\ev 命令使用的编辑器。这些变量按列出的顺序进行检查;第一个设置的变量将被使用。如果它们都没有设置,则默认情况下在 Unix 系统上使用 vi,在 Windows 系统上使用 notepad.exe

PSQL_EDITOR_LINENUMBER_ARG #

\e\ef\ev 与行号参数一起使用时,此变量指定用于将起始行号传递给用户编辑器的命令行参数。对于 Emacsvi 等编辑器,这是一个加号。如果选项名称和行号之间需要空格,则在变量的值中包含一个尾随空格。示例

PSQL_EDITOR_LINENUMBER_ARG='+'
PSQL_EDITOR_LINENUMBER_ARG='--line '

默认情况下,在 Unix 系统上为 +(对应于默认编辑器 vi,并且对许多其他常用编辑器都有用);但在 Windows 系统上没有默认值。

PSQL_HISTORY #

命令历史文件备用位置。将执行波浪号 (~) 扩展。

PSQL_PAGER
PAGER #

如果查询的结果不适合屏幕,则通过此命令进行管道传输。典型值为 moreless。通过将 PSQL_PAGERPAGER 设置为空字符串,或通过调整 \pset 命令的与分页器相关的选项,可以禁用分页器的使用。这些变量按列出的顺序检查;第一个设置的变量将被使用。如果两者都没有设置,则默认情况下在大多数平台上使用 more,但在 Cygwin 上使用 less

PSQL_WATCH_PAGER #

当使用 \watch 命令重复执行查询时,默认情况下不使用分页器。可以通过在 Unix 系统上将 PSQL_WATCH_PAGER 设置为分页器命令来更改此行为。 pspg 分页器(不是 PostgreSQL 的一部分,但在许多开源软件发行版中可用)如果使用 --stream 选项启动,可以显示 \watch 的输出。

PSQLRC #

用户 .psqlrc 文件的备用位置。将执行波浪号 (~) 扩展。

SHELL #

\! 命令执行的命令。

TMPDIR #

用于存储临时文件的目录。默认值为 /tmp

与大多数其他 PostgreSQL 实用程序一样,此实用程序还使用 libpq 支持的环境变量(请参阅 第 32.15 节)。

文件

psqlrc~/.psqlrc #

除非传递了 -X 选项,否则 psql 会尝试从系统范围的启动文件 (psqlrc) 中读取并执行命令,然后在连接到数据库但接受正常命令之前执行用户的个人启动文件 (~/.psqlrc)。这些文件可用于根据需要设置客户端和/或服务器,通常使用 \setSET 命令。

系统范围的启动文件名为 psqlrc。默认情况下,它位于安装的 系统配置 目录中,可以通过运行 pg_config --sysconfdir 最可靠地识别该目录。通常,此目录相对于包含 PostgreSQL 可执行文件的目录,为 ../etc/。可以通过 PGSYSCONFDIR 环境变量显式设置要查找的目录。

用户的个人启动文件名为 .psqlrc,位于调用用户的 home 目录中。在 Windows 上,个人启动文件改为名为 %APPDATA%\postgresql\psqlrc.conf。在这两种情况下,都可以通过设置 PSQLRC 环境变量来覆盖此默认文件路径。

系统范围的启动文件和用户的个人启动文件都可以通过在文件名后追加连字符和 PostgreSQL 主版本或次版本标识符来使其成为 psql 版本特定的,例如 ~/.psqlrc-17~/.psqlrc-17.0。与版本匹配的最具体的版本文件将优先于非版本特定的文件。这些版本后缀是在确定文件路径(如上所述)后添加的。

.psql_history #

命令行历史记录存储在文件 ~/.psql_history 中,或在 Windows 上存储在 %APPDATA%\postgresql\psql_history 中。

可以通过 HISTFILE psql 变量或 PSQL_HISTORY 环境变量显式设置历史记录文件的位置。

注意

  • psql 最适合与相同或较旧主版本的服务器配合使用。如果服务器的版本比 psql 本身更新,则反斜杠命令特别容易失败。但是,\d 系列的反斜杠命令应该可以与版本回溯到 9.2 的服务器配合使用,但不能保证与比 psql 本身更新的服务器配合使用。运行 SQL 命令和显示查询结果的一般功能也应该可以与较新主版本的服务器配合使用,但不能保证在所有情况下都能正常工作。

    如果你想使用 psql 连接到几个不同主版本的服务器,建议你使用最新的 psql 版本。或者,你可以保留每个主版本的 psql 副本,并确保使用与相应服务器匹配的版本。但在实践中,这种额外的复杂性应该没有必要。

  • PostgreSQL 9.6 之前,-c 选项隐含了 -X (--no-psqlrc);现在不再是这样。

  • PostgreSQL 8.4 之前,psql 允许单字母反斜杠命令的第一个参数直接在命令之后开始,不带空格。现在,需要一些空格。

Windows 用户注意事项

psql 被构建为一个 控制台应用程序。由于 Windows 控制台窗口使用与系统其余部分不同的编码,因此在 psql 中使用 8 位字符时,必须格外小心。如果 psql 检测到有问题的控制台代码页,它将在启动时发出警告。要更改控制台代码页,需要做两件事

  • 通过输入 cmd.exe /c chcp 1252 来设置代码页。(1252 是适合德语的代码页;请用你的值替换它。)如果你使用的是 Cygwin,你可以将此命令放在 /etc/profile 中。

  • 将控制台字体设置为 Lucida Console,因为光栅字体不适用于 ANSI 代码页。

示例

第一个示例显示如何将命令分布在多个输入行上。注意提示的变化

testdb=> CREATE TABLE my_table (
testdb(>  first integer not null default 0,
testdb(>  second text)
testdb-> ;
CREATE TABLE

现在再次查看表定义

testdb=> \d my_table
              Table "public.my_table"
 Column |  Type   | Collation | Nullable | Default
--------+---------+-----------+----------+---------
 first  | integer |           | not null | 0
 second | text    |           |          |

现在我们将提示更改为更有趣的提示

testdb=> \set PROMPT1 '%n@%m %~%R%# '
peter@localhost testdb=>

假设你已经用数据填充了表,并且想查看它

peter@localhost testdb=> SELECT * FROM my_table;
 first | second
-------+--------
     1 | one
     2 | two
     3 | three
     4 | four
(4 rows)

你可以通过使用 \pset 命令以不同的方式显示表

peter@localhost testdb=> \pset border 2
Border style is 2.
peter@localhost testdb=> SELECT * FROM my_table;
+-------+--------+
| first | second |
+-------+--------+
|     1 | one    |
|     2 | two    |
|     3 | three  |
|     4 | four   |
+-------+--------+
(4 rows)

peter@localhost testdb=> \pset border 0
Border style is 0.
peter@localhost testdb=> SELECT * FROM my_table;
first second
----- ------
    1 one
    2 two
    3 three
    4 four
(4 rows)

peter@localhost testdb=> \pset border 1
Border style is 1.
peter@localhost testdb=> \pset format csv
Output format is csv.
peter@localhost testdb=> \pset tuples_only
Tuples only is on.
peter@localhost testdb=> SELECT second, first FROM my_table;
one,1
two,2
three,3
four,4
peter@localhost testdb=> \pset format unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep '\t'
Field separator is "    ".
peter@localhost testdb=> SELECT second, first FROM my_table;
one     1
two     2
three   3
four    4

或者,使用简短的命令

peter@localhost testdb=> \a \t \x
Output format is aligned.
Tuples only is off.
Expanded display is on.
peter@localhost testdb=> SELECT * FROM my_table;
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

此外,这些输出格式选项可以通过使用 \g 仅为一个查询设置

peter@localhost testdb=> SELECT * FROM my_table
peter@localhost testdb-> \g (format=aligned tuples_only=off expanded=on)
-[ RECORD 1 ]-
first  | 1
second | one
-[ RECORD 2 ]-
first  | 2
second | two
-[ RECORD 3 ]-
first  | 3
second | three
-[ RECORD 4 ]-
first  | 4
second | four

以下是如何使用 \df 命令查找名称匹配 int*pl 且第二个参数类型为 bigint 的函数的示例

testdb=> \df int*pl * bigint
                          List of functions
   Schema   |  Name   | Result data type | Argument data types | Type
------------+---------+------------------+---------------------+------
 pg_catalog | int28pl | bigint           | smallint, bigint    | func
 pg_catalog | int48pl | bigint           | integer, bigint     | func
 pg_catalog | int8pl  | bigint           | bigint, bigint      | func
(3 rows)

如果合适,查询结果可以通过 \crosstabview 命令以交叉表表示形式显示

testdb=> SELECT first, second, first > 2 AS gt2 FROM my_table;
 first | second | gt2
-------+--------+-----
     1 | one    | f
     2 | two    | f
     3 | three  | t
     4 | four   | t
(4 rows)

testdb=> \crosstabview first second
 first | one | two | three | four
-------+-----+-----+-------+------
     1 | f   |     |       |
     2 |     | f   |       |
     3 |     |     | t     |
     4 |     |     |       | t
(4 rows)

第二个示例显示了一个乘法表,其中行按反向数字顺序排序,列具有独立的升序数字顺序。

testdb=> SELECT t1.first as "A", t2.first+100 AS "B", t1.first*(t2.first+100) as "AxB",
testdb-> row_number() over(order by t2.first) AS ord
testdb-> FROM my_table t1 CROSS JOIN my_table t2 ORDER BY 1 DESC
testdb-> \crosstabview "A" "B" "AxB" ord
 A | 101 | 102 | 103 | 104
---+-----+-----+-----+-----
 4 | 404 | 408 | 412 | 416
 3 | 303 | 306 | 309 | 312
 2 | 202 | 204 | 206 | 208
 1 | 101 | 102 | 103 | 104
(4 rows)

提交更正

如果你在文档中发现任何不正确的内容,与你对特定功能的体验不符,或者需要进一步澄清,请使用 此表格 报告文档问题。