\set [ name [ value [ ... ] ] ]
设置内部变量 name 为 value 或着如果给出了多于一个值,设置为所有这些值的联接结果。如果没有给出第二个参数,只设变量不设值。要重置一个变量,使用 \unset 命令。
有效的变量名可以包含字符,数字和下划线。 参阅下面的 变量 获取细节。
尽管你可以设置任何变量为任意值, psql对一些变量特殊对待。它们在关于变量的节里面有文档。
注意: 这条命令是完全和 SQL 命令 SET 不一样的。
\t
切换输出的列/字段名的信息头和行记数脚注。 这条命令等效于 \pset tuples_only,提供主要为了方便。
\T table_options
允许你在使用HTML输出模式时声明放在 table 标记里的属性。 这条命令等效于 \pset tableattr table_options。
\w {filename | |command}
将当前查询缓冲区输出到文件 filename 或者定向到 Unix 命令 command。
\x
切换扩展行格式。等效于 \pset expanded。
\z [ pattern ]
生成一个带有访问权限列表的数据库中所有表,视图和序列的列表。 如果给出任何pattern,则被当成一个规则表达式,只显示匹配的表,视图和序列。
命令 GRANT 和 REVOKE 用于设置访问权限。 参阅 GRANT 获取更多信息。
这是 \dp("显示权限")的别名。
\! [ command ]
返回到一个独立的 Unix shell 或者执行 Unix 命令 command。 参数不会被进一步解释,shell 将看到全部参数。
\?
获得关于反斜杠命令的帮助信息。
各种 \d 命令都接受一个 pattern 参数,声明要显示的对象名字。* 表示"任何字符序列", 而 ? 表示"任何单个字符"。(这个表示法和 Unix 的 shell 文件名模式兼容。)高级用户也可以使用正则表达式表示法,比如字符表,[0-9] 这样的东西来匹配"任意数字"。要让任何这些模式匹配字符可以安字面方式解析,那就应该用双引号包围它们。
一个包含(无引号的)句点的模式会被解析承一个模式名的模式后面跟着一个对象名的模式。 比如, \dt foo*.bar* 显示所有以foo 开头的模式里的以 bar 开头的表名字。如果没有出现句点,那么这个模式只匹配在当前模式搜索路径中可见的对象。
如果完全省略 pattern 参数, 那么 \d 命令显示所有在当前模式搜索路径中可见的对象。要查阅在数据库中的所有对象,使用模式 *.*。
高级特性
变量
psql 提供类似通常 Unix 命令 shell 那样的变量替换特性。 变量只是简单的名称/数值对,这里的值可以是任何长度的任何值。要设置一个变量,使用 psql 元命令 \set:
testdb=> \set foo bar
把变量"foo" 设置为值 "bar"。 要检索变量的内容,在变量名前面放上冒号然后把它用在任意斜杠命令里:
testdb=> \echo :foo
bar
注意: \set 的参数服从和其他命令一样的替换规则。 因此你可以构造有趣的引用,象 \set :foo 'something' 这样, 获得分别象Perl或 PHP那样有名的"软连接(soft links)"或"变量 变量"。 不幸的是(或者万幸的?),用这些构造不能做任何有用的事情。另一方面, \set bar :foo 是一个非常有效的拷贝变量的方法。
如果你不带第二个参数调用\set, 那么只是设置这个变量而没有值。 要重置(或删除)一个变量,使用命令 \unset。
psql的内部变量可以包括任意顺序, 任意数量的字母,数字和下划线。 有一些常用变量被 psql 另眼相待。它们是一些选项设置,这些选项在运行时可以通过改变变量的值或者改变一些应用的表现状态而改变。尽管你可以把这些变量用于其他用途,但是我们不鼓励这么做,因为程序的特性可能会很快变得非常奇怪。通常,所有特殊对待的变量都是由大写字母组成(可能还有数字和下划线)。 为了保证和未来的最大限度的兼容性,请避免使用这样的变量。下面是一个所有特殊对待的变量列表。
AUTOCOMMIT
如果是 on(缺省),那么每个 SQL 命令都在成功完成后自动提交。 要推迟这种模式下的提交,你必须输入一个 BEGIN 或者 START TRANSACTION SQL 命令。 如果是 off 或者未设置,SQL 命令不会提交,知道你明确地发出 COMMIT 或者 END。 关闭自动提交的模式是通过为你明确发出一个 BEGIN 实现的, 它是放在任何尚未在一个事务块中并且自己不是 BEGIN 或者其它事务控制命令也不是那些不能在事务块里执行的命令 (比如 VACUUM)的前面。
注意: 在关闭自动提交的模式下,你必须明确放弃任何失败的事务,方法是执行 ABORT 或者 ROLLBACK。还要注意如果你不提交就退出会话,你的工作会丢失。
注意: 自动提交打开方式是 PostgreSQL 传统的行为, 但是关闭自动提交更接近 SQL 规范。如果你喜欢关闭自动提交,你应该在你的 .psqlrc 文件里设置它。
DBNAME
你正在联接着的数据库名称。 每次你与一个数据库联结都会设置这个值(包括程序启动),但是可以删除。
ECHO
如果置为 all, 输入的或者来自键盘或者一个脚本的所有行在分析或执行前都写到标准输出。 要在程序启动时声明这些,使用 -a如果设置为 queries, psql 只是在查询发送给服务器之前打印出来。 实现这个功能的命令行选项是 -e。
ECHO_HIDDEN
当设置了这个变量并且一个反斜杠命令查询数据库时,首先显示查询。 这样你可以学习 PostgreSQL 内部的东西并且在你自己的程序里提供类似功能。如果你设置该变量的值为 "noexec",查询只是显示出来但是实际上不发送到服务器和执行。
ENCODING
当前的客户端字符集编码。
HISTCONTROL
如果这个变量设置为 ignorespace, 以空格开始的行将不会进入历史列表。 如果设置为变量 ignoredups,与以前历史记录里匹配的行也不会进入历史记录。值 ignoreboth是上面两个的结合。如果删除此变量或者其值为任何与上面的值不同的东西, 所有交互模式读入的行都被保存入历史列表。
注意: 这个特性是无耻地从 Bash 里剽窃来的。
HISTSIZE
存在命令历史里的命令的个数。缺省值是 500。
Note: 这个特性是无耻地从 Bash里剽窃来的。
HOST
当前你正联接的数据库服务器主机。 这是在每次你与数据库联接时(包括程序启动)设置的,但是可以删除。
IGNOREEOF
如果删除此变量,向一个交互的 psql会话发送一个 EOF (通常是 Control-D)将终止应用。如果设置为一个数字值,那么在应用终止前该数值的 EOF 字符将被忽略。如果设置了此变量但是没有数字值,缺省是 10。
注意: 这个特性是无耻地从 Bash 里剽窃来的。
LASTOID
最后影响的oid值,即为从一条 INSERT 或 lo_insert 命令返回的值。 此变量只保证在下一条 SQL 命令的结果显示之前有效。
ON_ERROR_STOP
缺省时,如果非交互的脚本碰到一个错误,象一条错误的 SQL 命令或者内部元命令,处理会继续进行。 这是 psql 的传统特性,但是有时候我们不太希望这样。如果设置了这个变量,脚本处理将马上停止。 如果该脚本是从另外一个脚本调用的,那个脚本也会按同样的方式停止。如果最外层的脚本不是从一次交互的 psql 会话中调用的而是用 -f 选项调用的,psql 将返回错误代码 3,以示这个情况与致命错误条件的区别(错误代码 1)。
PORT
当前你正在联接的数据库服务器的端口。 这是在每次你与数据库联接时(包括程序启动)设置的,但是可以删除。
PROMPT1
PROMPT2
PROMPT3
这些指明psql 显示的提示符看上去象什么。 参阅下面的 提示符。
QUIET
这个变量等效于命令行选项 -q。 可能在交互模式下没有什么用。
SINGLELINE
这个变量等效于设置命令行选项 -S。你可以在运行时删除或设置它。
SINGLESTEP
这个变量等效于命令行选项 -s。
USER
当前你正用于联接的数据库用户。 这是在每次你与数据库联接时(包括程序启动)设置的,但是可以删除/重置。
VERBOSITY
这个选项可以设置为值 default,verbose,或者 terse 以控制错误报告的冗余行。
SQL 代换
一个附加的 psql 变量的有用特性是你可以把它们替换("代换")成正规的 SQL 语句。这样做的语法同样还是变量名前面加一个冒号(:)。
testdb=> \set foo 'my_table'
testdb=> SELECT * FROM :foo;
将 会查询表my_table。变量的值是逐字拷贝的, 所以它甚至可以包含不对称的引号或反斜杠命令。你必须保证你输入的东西是有意义的。变量替换将不会在引号引起来的 SQL 语句里面发生。
利用这个功能的一个时髦的应用是通过使用一个随后的语句中最后插入的 OID 建立一个外键仿真场景。另一个可能用到这个机制的地方是把一个文件的内容拷贝到一个字段里面去。 首先把文件装载到一个变量然后象上面那样处理。
testdb=> \set content '\'' `cat my_file.txt` '\''
testdb=> INSERT INTO my_table VALUES (:content);
这样处理的一个可能问题是 my_file.txt 可能包含单引号。这些需要被逃逸以免在处理第三行时不会导致语法错误。 可以使用程序 sed来做这个处理:
testdb=> \set content '\'' `sed -e "s/'/\\\\\\'/g" < my_file.txt` '\''
观察正确数量的反斜杠(6)!你可以这样解释它:在 psql 分析完这行后,它把 sed -e "s/'/\\\'/g" < my_file.txt 传递给shell。 shell 将对双引号里的东西做其处理然后用参数 -e 和 s/'/\\'/g执行 sed。当 sed分析这些时, 它将把双反斜杠替换为单个反斜杠然后进行替换。 可能有时候你认为所有 Unix 命令使用同一个逃逸字符是个好事。 但具有讽刺意味的事实是你可能不得不逃逸所有反斜杠,因为 SQL 文本常量同样也惨遭这种解释。 这种情况下你可能最好在外部准备文件。
因为冒号也可以合法的出现在 SQL 命令里,便有下面规则的应用: 如果没有设置变量,字符序列 "冒号+名称" 不会被改变。在任何情况下你都可以用反斜杠逃逸冒号以保护它免于被解释。 (变量的冒号语法是 SQL 用于嵌入查询语言的标准,如 ECPG。用于数组片段和类型转换的冒号语法是 PostgreSQL 扩展,因此有冲突。)
提示符
psql使用的提示符可以根据你的喜好客户化。三个变量 PROMPT1,PROMPT2,和 PROMPT3 包含描述提示符的外观的字串和特殊逃逸序列。Prompt 1 是 psql 请求一个新命令时的使用的正常提示符。 Prompt 2 是在一个命令输入期待更多输入时(因为查询没有用一个分号结束或者引号没有关闭)显示的提示符。 Prompt 3 在你运行一个 SQL COPY 命令和等待你在终端上键入记录时使用。
相应的提示符变量的值是按字面打印的,除非碰到一个百分号(%)。这时某些其他的文本被替换,替换为何物取决于下一个字符。已定义的替换是:
%M
数据库服务器主机名全名(带着域名),如果联接是通过 Unix 域套接字进行的就是 [local], 或者如果 Unix 域套接字不是编译的缺省位置,就是 [local:/dir/name]。
%m
数据库服务器的主机名删去第一个点后面的部分剩下的东西。 或者如果联接是通过 Unix 域套接字,就是 [local]。
%>
数据库服务器正在侦听的端口号。
%n
数据库会话的用户名。 (这个值的扩展可能在一个数据库会话过程中因为 SET SESSION AUTHORIZATION 命令而改变。)
%/
当前数据库名称。
%~
类似 %/, 但如果数据库是你的缺省数据库输出是"~" (波浪线(tilde))。
%#
如果会话用户是数据库超级用户,使用 "#",否则用">"。 (这个值的扩展可能在一个数据库会话过程中因为 SET SESSION AUTHORIZATION 命令而改变。)
%R
对于 prompt 1 通常是 =,但是如果是单行模式则是 ^,而如果会话与数据库断开(如果 \connect 失败可能发生)是 !。对于 prompt 2 该序列被 -,*,一个单引号,一个双引号或者一个美元符代替,这取决于 psql是否等待更多的输入(因为查询没有终止,或着正在一个 注释里面,或者因为你在引号或者美元符扩展里面)。对于 prompt 3 该序列不解释成任何东西。
%x
事务状态:如果不在事务块里,是一个空字串,如果在事务块里,是 *, 如果在一个失败的事务块里是 !,或者无法判断事务状态时为 ? (比如,因为没有连接)。
%digits
如果 digits 以 0x 开头, 那么其余字符被解释成一个十六进制数字并且替换为对应(十六进制码)的字符。 如果第一个数字是 0,该字符被解释成一个八进制数字并且替换为对应的(八进制码)的字符。 否则认为是一个十进制数字。
%:name:
psql变量name的值。参阅 变量 节获取细节。
%`command`
command的输出, 类似于通常的"反勾号(back-tick)" 替换。
%[ ... %]
提示可以包含终端控制字符,这些字符可以改变颜色,北京,或者提示文本的风格, 或者改变终端窗口的标题。为了让 Readline 的行编辑特性正确运行, 这些不可打印的控制字符必须设计成不可见的,方法是用 %[ 和 %] 包围它们。在提示符里可能出现这些东西的多个配对。
testdb=> \set PROMPT1 '%[%033[1;33;40m%]%n@%/%R%[%033[0m%#%] '
这 样的结果是在 VT100 兼容的可显示彩色的终端上的一个宽体(1;)黑底黄字(33;40)。
要在提示符里插入百分号,键入%%。缺省提示符等效于 '%/%R%# ' 用于 prompts 1 和 2,以及'>> ' 用于 prompt 3。
注意: 这个特性是无耻地从tcsh 里剽窃来的。
命令行编辑
psql 为了编辑和检索命令行的方便支持 Readline 和历史库。 命令历史在 psql 退出的时候自动保存,在 psql 启动的时候装载。 还支持 Tab 补齐,尽管该补齐逻辑并不是一个 SQL 分析器必备的。 如果因某些原因你不喜欢 tab 补齐,你可以把下面几行放在你的家目录的一个叫 .inputrc 的文件里关闭这个特性:
$if psql
set disable-completion on
$endif
(这不是psql 的特性, 是 Readline 的。参考它的文档获取更多细节。)
环境
PAGER
如果查询结果在一页里放不下,那么它们被定向到这个命令。 典型的值是 more 或者 less。 缺省的是平台相关的。我们可以用 \pset 命令关闭分页器。
PGDATABASE
缺省连接的数据库
PGHOST
PGPORT
PGUSER
缺省连接参数
PSQL_EDITOR
EDITOR
VISUAL
\e 命令使用的编辑器。这些变量是按照上面的顺序检查的;设置最早的最先使用。
SHELL
\! 命令执行的命令。
TMPDIR
存储临时文件的目录。缺省是 /tmp。
文件
在启动之前,psql 视图读取系统的 psqlrc 文件和执行来自用户家目录的文件 ~/.psqlrc 里面的命令。 (在 Windows 里,用户的启动文件名字叫 %APPDATA%\postgresql\psqlrc.conf。) 参阅 PREFIX/share/psqlrc.sample 获取如何设置全系统的文件的信息。 可将它用于设置客户端或者服务器的风格(使用 \set和SET命令)。
系统的 psqlrc 和用户自己的 ~/.psqlrc 都可以通过在后面附着一个划线和 PostgreSQL 版本号的方法变得与版本相关, 比如 ~/.psqlrc-8.0.0。 匹配版本相关的文件比无版本的文件优先读取。
命令行历史存储在 ~/.psql_history,或者在 Windows 里是 %APPDATA%\postgresql\psql_history。
注意
一些 psql的早期版本允许一个单字母的反斜杠命令(元命令)的第一个参数直接跟在命令后面,而不用空白间隔。出于兼容性原因,这个特性仍然在某些程度上被支持,但是我不准备在这里详细解释,因为我不鼓励这样使用。不过如果你收到莫名其妙的信息,想想这个用法。例如
testdb=> \foo
Field separator is "oo".
可能不是你想要的东西。
psql 只能与同版本的服务器平稳地工作。 这不意味着其他组合会完全失败,但是可能有微小的或者不那么微小的问题。如果服务器的版本不同,反斜杠命令是特别容易失效的。
Windows 用户需要注意的地方
psql 是以一种"控制台应用"的方式制作的。 因为 Windows 控制台窗口和系统其它部分使用不同的编码, 所以在 psql 里使用 8 位字符的时候必须采取特殊的注意措施。 如果 psql 检测到一个有问题的控制台代码页,那么它在启动的时候会警告你。要修改控制台代码页,有两件事是必须做的:
通过输入 cmd.exe /c chcp 1252 设置代码页。(1252 是适用于德语的代码页;换成合适你的数值。译注:中文 GB2312 的代码页是 936。) 如果你使用 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 "my_table"
Attribute | Type | Modifier
-----------+---------+--------------------
first | integer | not null default 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 unaligned
Output format is unaligned.
peter@localhost testdb=> \pset fieldsep ","
Field separator is ",".
peter@localhost testdb=> \pset tuples_only
Showing only tuples.
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
--------------------------------------------------------------------------------------------------------
\a 在非对齐和对齐的输出模式之间切换
\c[onnect] [数据库名|- [用户名]]
联接到新的数据库 (当前为 "rftdatabase")
\C [字串] 设置表标题, 如果参数空则取消标题
\cd [目录名] 改变当前的工作目录
\copy ... 执行 SQL COPY, 数据流指向客户端主机
\copyright 显示 PostgreSQL 用法和发布信息
\d [名字] 描述表, 索引, 序列, 或者视图
列出表/索引/序列/视图/系统表
\d{t|i|s|v|S} [模式] (加 "+" 获取更多信息)
列出表/索引/序列/视图/系统表
\da [模式] 列出聚集函数
\dd [模式] 显示目标的注释
\dD [模式] 列出域
\df [模式] 列出函数 (加 "+" 获取更多的信息)
\do [名字] 列出操作符
\dl 列出大对象, 和 \lo_list 一样
\dp [模式] 列出表访问权限
\dT [模式] 列出数据类型 (加 "+" 获取更多的信息)
\du [模式] 列出用户
\e [文件名] 用一个外部编辑器编辑当前查询缓冲区或者文件
\echo [字串] 向标准输出写出文本
\encoding [编码] 设置客户端编码
\f [字串] 设置域分隔符
\g 文件名 向服务器发送 SQL 命令 (并且把结果写到文件或者 |管道)
\h [名字] SQL 命令的语法帮助, 用 * 可以看所有命令的帮助
\H 在 HTML 输出模式之间切换 (当前是 关闭)
\i 文件名 执行来自文件的命令
\l 列出所有数据库
\lo_export, \lo_import, \lo_list, \lo_unlink
大对象操作
\o 文件名 向文件或者 |管道 发送所有查询结果
\p 显示当前查询缓冲区的内容
\pset 名字 [值] 设置表的输出选项 (NAME := {foramt|border|expaned|
(名字 := {foramt|border|expanded|fieldsep|null|recordsep|
tuples_only|title|tableattr|pager})
\q 退出 psql
\qecho [字串] 向查询输出流写出文本 (见 \o)
\r 重置 (清理) 查询缓冲区
\s [文件名] 打印历史或者将其保存到文件
\set [名字 [值]] 设置内部变量, 如果没有参数就列出所有
\t 只显示行 (当前是 关闭)
\T [字串] 设置 HTML <表>标记属性, 如果没有参数就取消设置
\timing 查询计时开关切换 (目前是 关闭)
\unset 名字 取消(删除)内部变量
\w [文件名] 将当前查询缓冲区写出到文件
\x 在扩展输出之间切换 (目前是 关闭)
\z [模式] 列出表访问权限 (和 \dp 一样)
\! [命令] 在 shell 里执行命令或者开始一个交互的 shell
ABORT CREATE TABLE EXECUTE
ALTER DATABASE CREATE TABLE AS EXPLAIN
ALTER GROUP CREATE TRIGGER FETCH
ALTER TABLE CREATE TYPE GRANT
ALTER TRIGGER CREATE USER INSERT
ALTER USER CREATE VIEW LISTEN
ANALYZE DEALLOCATE LOAD
BEGIN DECLARE LOCK
CHECKPOINT DELETE MOVE
CLOSE DROP AGGREGATE NOTIFY
CLUSTER DROP CAST PREPARE
COMMENT DROP CONVERSION REINDEX
COMMIT DROP DATABASE RESET
COPY DROP DOMAIN
注:PostgreSQL客户端常用命令(转一)及PostgreSQL客户端常用命令(转二)均转自如下链接:http://blog.csdn.net/ThomasLiu83/archive/2008/08/05/2770448.aspx