你在 psql 裡輸入的任何以不帶引號的反斜槓('\')開頭的東西都是 psql 元命令,這些命令是由 psql 自己處理的。這些命令也是令 psql 可用於管理或書寫指令碼的原因。 元命令更常見的叫法是斜槓或反斜槓命令。
一個 psql 命令的格式是反斜槓後面緊跟一個命令動詞,然後是任意引數。 引數與命令動詞和其他引數以任意個空白字元間隔。
要在引數裡面包含空白,你必須用單引號把它包圍起來。 要在這樣的引數裡包含單引號,前面加一個反斜槓。 任何包含在單引號裡的東西會被進一步進行類 C 的替換,把 \n (new line),\t (tab), \digits, \0digits, 和 \0xdigits (給出的十進位制,八進位制,或十六進位制碼的字元)替換掉。
如果一個不帶引號的引數以冒號(:)開頭, 它會被當作一個psql 變數,並且該變數的值會最終成為真正的引數值。 (譯註:類似 ecpg 和 pl/pgsql 的變數用法。)
用反引號 ("backticks" `) 包圍的內容被當作一個命令列傳入 shell。 該命令的輸出(刪除了結尾的新行)被當作引數值。上面描述的逃逸(字元)序列在反引號裡也生效。
有些命令以一個 SQL 標識的名稱(如,一個表名)為引數。 這些引數遵循 SQL 語法關於雙引號的規則: 不帶雙引號的標識強制成小寫, 而雙引號保護字母不受大小寫轉換,並且允許在識別符號中使用空白。 在雙引號中,成對的雙引號在結果名字中分析成一個雙引號。比如, FOO"BAR"BAZ 解析成 fooBARbaz,而 "A weird"" name" 變成 A weird" name。 name.
對引數的分析在碰到另一個不帶引號的反斜槓時停止。 這裡會認為是一個新的元命令的開始。特殊序列 \\ (雙反斜槓)標識引數的結尾並將繼續分析後面的 SQL 命令(如果存在的話)。這樣 SQL 和 psql命令可以自由的在一行裡面混合。 但是在任何情況下,一條元命令的引數不能延續超過行尾。
下列元命令是已定義的:
- \a
-
如果目前的表輸出格式是不對齊的,切換成對齊的。 如果是對齊的,切換成不對齊。這條命令是為了向後相容。參閱\pset 獲取一個通用的解決方法。 - \cd [directory]
-
把當前工作目錄改變到 directory。 沒有引數是則改變到當前使用者的家目錄。
Tip: 提示: 要打印出你的當前工作目錄,使用\!pwd.
- \C [title ]
-
把正在列印的表的標題設定為一個查詢的結果或者取消這樣的設定。 這條命令等效於 \pset titletitle. (這條命令的名稱源於 "caption",因為以前只是用於在一個 HTML 表裡面設定標題。) - \connect (or\c) [dbname [username ] ]
-
與一個新的資料庫建立一個聯接,使用/不用一個使用者名稱。 前面的聯接將關閉。如果 dbname 是 -,那麼就假設是當前資料庫名稱。
如果省略 username,則假設是當前使用者名稱。
作為一條特殊規則,不帶任何引數執行\connect 將以預設使用者身份與預設資料庫連線(正如你不帶任何引數執行 psql 一樣。)
如果聯接失敗(使用者名稱錯,訪問拒絕等),那麼將保留前面的聯接--當且僅當在 psql 處於互動模式下如此。 如果執行的是非互動的指令碼,處理會馬上停止,並返回一個錯誤。 選擇這樣的區別是一方面為使用者使用方便考慮,另一方面為保證指令碼不會碰巧操作了錯誤的資料庫的安全機制考慮的。
- \copytable
-
執行前端(客戶端)複製。這是一個執行 SQL COPY 命令的操作, 不同的是 SQL COPY 是伺服器在讀寫指明的檔案,而 psql 讀寫檔案並作為本地的檔案系統和伺服器之間的路由取出或寫入資料。 這意味著檔案訪問性和許可權都是本地使用者的,而不是伺服器的,因此不需要 SQL 超級使用者許可權。
這條命令的語法是模擬 SQL COPY 命令的。(參考它的描述獲取細節。) 要注意的是由此而來,有一些特殊的分析規則應用於\copy 命令。 尤其是變數替換規則和反斜槓代換規則不起作用。
Tip: 提示: 此操作不象 SQL COPY 命令這樣高效, 因為所有資料必須透過客戶端/伺服器聯接。對於大資料量的操作,另一種方法更可行。
Note: 注意: 注意在客戶端和伺服器複製時對 stdin 和 stdout 的解釋的區別:在前端複製時,這些總是指 psql的輸入和輸出流。在伺服器複製時 stdin 來自 COPY 本身的標準輸入(比如,一個帶有 -f 選項的指令碼), 而 stdout 指的是查詢輸出流(參閱下面的\o 元命令)。
- \copyright
-
顯示 PostgreSQL 的版權和版本資訊。 - \d [pattern ]
-
對於每個匹配pattern的關係(表,檢視,索引或者序列), 顯示所有列,它們的型別,和任何特殊屬性,象NOT NULL或預設等--只要存在。 如果實際上這個關係是一個表,任何已定義的索引,主鍵,唯一約束相關的索引,規則,約束,和觸發器也同樣顯示出來, 如果關係是一個檢視,還顯示檢視的定義。 ("匹配模式"在下面定義。) 從\d+ 來的命令也是一樣的,只不過還顯示與表的列關聯的註解。
Note: 注意: 如果如果不帶任何pattern呼叫\d , 等效於\dtvs,將顯示一個所有表,檢視和序列的列表。 這完全是出於方便的考慮。
- \da [pattern ]
-
列出所有可用聚集函式,以及它們操作的資料型別。如果聲明瞭 pattern,那麼只顯示匹配(正則表示式)的聚集函式。 - \dc [pattern ]
-
列出所有字符集之間的可用轉換。如果聲明瞭 pattern, 則只列出那些匹配模式的轉換。 - \dC
-
列出所有型別轉換。 - \dd [pattern ]
-
顯示所有匹配 pattern 的描述,如果沒有給出引數,顯示所有可視物件。 但是不管怎樣,只有那些有描述內容的物件才顯示出來。 ("物件"包括聚集,函式,運算子,型別, 關係(表,檢視,索引,序列,大物件),規則和觸發器。)例如: =>\dd version
Object descriptions
Schema | Name | Object | Description
------------+---------+----------+---------------------------
pg_catalog | version | function | PostgreSQL version string
(1 row)
可以用COMMENT SQL 命令生成對物件的描述。
- \dD [pattern ]
-
列出所有可用域。如果聲明瞭 pattern,那麼只顯示匹配的域。 - \df [pattern ]
-
列出所有可用函式,以及它們的引數和返回的資料型別。如果聲明瞭 pattern,那麼只顯示匹配(正則表示式)的函式。如果使用了\df+ 的形式,每個函式的附加資訊,包括語言和描述也會顯示出來。
Note: 注意: 為了減少混亂,\df 並不顯示資料型別的 I/O 函式。 這樣是透過忽略那些接受或者返回型別 cstring 的函式實現的。
- \distvS [pattern ]
-
這不是一個實際上的命令名稱:字母 i,s,t,v,S 分別代表索引(index), 序列(sequence),表(table),檢視(view)和系統表(system table)。 你可以以任意順序宣告任意或者所有這些字母獲得這些物件的一個列表。 字幕 S 把列表限制於系統物件;如果沒有 S,則只顯示非系統物件。 如果在命令名上附加了 +,那麼還會列出和每個物件相關聯的描述,如果有的話。
如果聲明瞭 pattern,那麼只列出匹配模式的物件。
- \dl
- 這是\lo_list 的別名,顯示一個大物件的列表。
- \dn [pattern ]
-
列出所有可用模式(名字空間)。如果聲明瞭 pattern (一個正則表示式),那麼只列出匹配模式的模式名。 - \do [pattern ]
-
列出所有可用運算子,以及它們的運算元和返回的資料型別。 如果聲明瞭 pattern,那麼只顯示匹配模式的運算子。 - \dp [pattern ]
-
生成一列可用的表和它們相關的許可權。 如果聲明瞭 pattern, 那麼只列出名字可以匹配模式的表。
命令grant(7) 和revoke(7) 用於設定訪問許可權。參閱grant(7) 獲取更多資訊。
- \dT [pattern ]
-
列出所有資料型別或只顯示那些匹配 pattern的。這條命令的\dT+ 形式顯示更多資訊。 - \du [pattern ]
-
列出所有已配置使用者或者只列出那些匹配 pattern 的使用者。 - \edit (or\e) [filename ]
- 如果聲明瞭 filename, 則編輯此檔案並且在編輯器退出後將其內容複製回查詢緩 衝區。 如果沒有給出引數,則把當前查詢緩衝區內容複製到一個臨時檔案然後以相 同方式編輯。
然後根據一般的psql規則重新分析查詢緩衝區, 這時整個緩衝區當作一個單行。 (因此你無法用這個方法制作“指令碼”,用\i 做指令碼。) 這還意味著 如果該查詢以分號結尾(或者包含分號),它就會馬上被執行。否則它只是在查詢 緩衝區裡等待。
Tip: 提示: psql 搜尋環境變數 PSQL_EDITOR,EDITOR 和 VISUAL(以此順序)查詢要用到哪個編輯器。如果上面的都沒有設定,使用/bin/vi。
- \echotext [ ... ]
-
向標準輸出列印引數,用一個空格分隔並且最後跟著一個新行。 這個特性在顯示指令碼的輸出時會有用。例如: =>\echo `date`
Tue Oct 26 21:40:57 CEST 1999
果第一個引數是一個無引號的 -n,那麼不會寫出結尾的新行。
Tip: 提示: 如果你使用\o 命令重定向你的查詢的輸出,你可能會用\qecho 取代這條命令。
- \encoding [encoding ]
-
設定客戶端字元編碼方式。不帶引數時,這條命令顯示當前的編碼方式。 - \f [string ]
-
為不對齊的查詢輸出設定域分隔符。預設時是豎條(|)。 參閱\pset 獲取設定輸出選項的通用方法。 - \g [ {filename | |command } ]
-
把當前的查詢輸入緩衝區的內容傳送給伺服器並且把輸出輸出到可選的 filename 或者把輸出定向到一個獨立的 Unix shell 執行 command。 單獨一個\g 實際上等效於一個分號。一個帶有引數的\g 是"一次性"的\o 命令的代用品。 - \help (or\h) [command ]
-
給出指定 SQL 命令的語法幫助。如果沒有給出 command ,那麼 psql 將列出可獲得語法幫助的所有命令。如果 command 是一個星號("*"),則顯示所有 SQL 命令的語法幫助。
Note: 注意: 為簡化敲擊,包含多個單字的命令不需要引用。因此鍵入\help alter table 是正確的。
- \H
-
開啟 HTML 查詢輸出格式。如果 HTML 格式已經開啟,則切換回預設的對齊的文字格式。 這個命令是為了相容和方便,參閱\pset 獲取設定其他輸出選項的內容。 - \ifilename
-
從檔案filename中讀取並把其內容當作從鍵盤輸入的那樣執行查詢。
Note: 注意: 如果你想在螢幕上看到讀入的行,你必須對所有行設定變數 ECHO 為 all。
- \l (or\list)
-
列出伺服器上所有資料庫的名字和它們的所有者以及字符集編碼。在命令名稱後面加一個 "+" 還可以看到對資料庫的描述。 - \lo_exportloidfilename
-
從資料庫裡讀取 OID 為 loid 的大物件並把她寫到 filename裡。 注意這個功能與伺服器函式 lo_export 有些微小的區別, lo_export 執行時帶著執行資料庫伺服器的使用者許可權, 而且是在伺服器的檔案系統上。
Tip: 提示: 使用\lo_list 檢視大物件的 OID。 OID.
- \lo_importfilename [comment ]
-
把檔案儲存為一個 PostgreSQL 大物件。可以帶著一個該物件的註解選項。例如: foo=>\lo_import '/home/peter/pictures/photo.xcf' 'a picture of me'
lo_import 152801
響應表明此大物件得到一個物件標識 152801,如果你還想訪問該物件,就應該把這個物件標識記住。 因此,我們建議總是給每個物件關聯一個人類可讀的註解。那樣就可以用\lo_list 命令看到這些註解。
注意這條命令與伺服器端的 lo_import 有一些區別,因為這條命令是本地使用者在本地檔案系統上操作, 而不是以伺服器使用者在伺服器檔案系統上操作。
- \lo_list
-
顯示一個目前儲存在該資料庫裡的所有 PostgreSQL 大物件和它們的所有者的列表。 - \lo_unlinkloid
-
從資料庫裡刪除OID為loid 的大物件。
Tip: 提示: 使用\lo_list 查詢大物件的 OID。 OID.
- \o [ {filename | |command} ]
-
把後面的查詢結果儲存到檔案 filename 裡或者把後面的查詢結果定向到一個獨立的 Unix shell 執行 command。 如果沒有宣告引數,查詢輸出重置為標準輸出。 "查詢結果"包括所有表,命令響應和從資料庫伺服器來的提示, 同樣還有各種各樣查詢資料庫的反斜槓命令的輸出(如\d),但是沒有錯誤資訊。
Tip: 提示: 要用文字分散查詢結果之間的輸出,用\qecho。
- \p
-
列印當前查詢緩衝區到標準輸出。 - \psetparameter [value ]
-
這條命令設定影響查詢結果表輸出的選項。parameter 描述要設定的選項是哪一個。value 的語意也取決於它。
可調節的列印選項有:
- format
-
設定輸出格式為 unaligned,aligned,html, 或 latex之一。允許使用唯一的縮寫。(這也意味著一個字母就夠了。) "Unaligned" (不對齊)把一條記錄的所有欄位都輸出到一行, 用當前有效的域分隔符分隔。這主要用於生成那些要被其他程式讀取的輸出(tab分隔,逗號分隔)。 "Aligned" (對齊)模式是標準的,人類可讀的,格式化好了的文字輸出,也是預設。 "HTML" 和 "LaTeX" 模式把表輸出為可用於文件裡的對應標記語言。它們還不是完整的文件! (可能對於 HTML 變化還不是太大,但是在 LaTeX 裡,你必須有一個完整的文件包裝器。)
- border
-
第二個引數必須是一個數字。通常,數字越大,表就有越寬的邊界和越多的線, 但是這個引數取決於實際的格式。在HTML模式裡, 這個引數會直接翻譯成border=...屬性,在其他的模式裡, 只有值 0 (無邊界),1 (內部分隔線)和 2 (表框架)有意義。 - expanded (or x)
-
在正常和擴充套件格式之間切換。當開啟擴充套件格式時,所有的輸出都是兩列, 欄位名稱在左,資料在右。 這個模式在資料無法放進通常的"水平"模式的螢幕時很有用。
所有四種輸出模式都支援擴充套件格式。
- null
-
第二個引數是一個字串,用以代表欄位的值為 null 時的列印輸出。 預設是什麼都不打,這樣很容易和類似一個空字串混淆。 因此,我們可能選擇\pset null '(null)'。 - fieldsep
-
宣告在非對齊模式時的域分隔符。 這樣我們就可以建立其他程式希望的tab或逗號分隔的輸出。要設定 tab 域分隔符, 鍵入\pset fieldsep ''。預設域分隔符是 '|' (一個豎條符號)。 -
切換預設足標的顯示 (x rows)。 - recordsep
-
宣告在非對齊模式時的記錄分隔符。預設是換行符。 - tuples_only (或 t)
-
在完全顯示和只顯示記錄之間切換。 完全顯示將顯示象列頭,標題和各種腳註等資訊。 只顯示記錄模式將只顯示實際的表資料。 - title [text ]
-
為任何隨後列印的表設定標題。 這個引數可以用於給你的輸出一個描述性標記。 如果不帶引數,重置標題。 - tableattr (or T) [text ]
-
允許你宣告放在 HTML table 標記裡的任何屬性。例如,可以是 cellpadding 或 bgcolor。注意你可能不需要在這裡宣告 border ,因為已經在\pset border 裡用過了。 -
控制查詢和psql幫助輸出的分頁器。如果設定了環境變數 PAGER, 輸出被定向到指定程式,否則使用系統預設(比如 more)。
如果關閉了分頁器,則不使用它,如果打開了,程式只在需要的時候使用分頁器,也就是說, 輸出是到終端,而且那個表很可能無法與螢幕匹配。 (psql 在決定何時分頁時不是很完美。)\pset pager 開關分頁器。我們也可以把分頁器設定為 always,導致我們在任何情況下都使用分頁器。
可以在 "Examples 例子" 節看到這些不同格式輸出的示例。
Tip: 提示: 有很多用於\pset 的快速命令。參閱 \a,\C,\H, \t,\T, 和\x。
Note: 注意: 無引數執行\pset 是錯誤的。 以後這樣呼叫將顯示當前列印選項狀態。
- \q
-
退出 psql 程式。 - \qechotext [ ... ]
-
這條命令等效於\echo ,區別是所有輸出將寫入由\o 設定的輸出通道。 - \r
-
重置(清空)查詢緩衝區。 - \s [filename ]
-
將命令列歷史打印出或是存放到 filename。 如果省略 filename, 歷史將輸出到標準輸出。這個選項只有在 psql 配置成使用 GNU 歷史庫後才生效。
Note: 注意: 在當前版本里,這個( GNU 歷史庫)不再是必須的了, 實際上,在程式結束時自動儲存命令列歷史。每次 psql 啟動都會裝載命令列歷史。
- \set [name [value [ ... ]]]
-
設定內部變數 name 為 value 或著如果給出了多於一個值, 設定為所有這些值的聯接結果。如果沒有給出第二個引數,只設變數不設值。要重置一個變數,使用\unset 命令。
有效的變數名可以包含字元,數字和下劃線。 參閱下面的 "Variables 變數" 獲取細節。
儘管你可以設定任何變數為任意值, psql對一些變數特殊對待。它們在關於變數的節裡面有文件。
Note: 注意: 這條命令是完全和 SQL 命令 SET [
set(7)] 不一樣的。
- \t
-
切換輸出的列/欄位名的資訊頭和行記數腳註。 這條命令等效於\pset tuples_only,提供主要為了方便。 - \Ttable_options
-
允許你在使用HTML輸出模式時宣告放在 table 標記裡的屬性。 這條命令等效於\pset tableattr table_options。 - \timing
- 切換每個 SQL 語句使用的時間,單位是毫秒。
- \w {filename ||command}
-
將當前查詢緩衝區輸出到檔案 filename 或者定向到 Unix 命令 command。 - \x
-
切換擴充套件行格式。等效於\pset expanded。 - \z [pattern ]
-
生成一個帶有訪問許可權列表的資料庫中所有表的列表。 如果給出任何pattern,則被當成一個規則表示式, 只顯示匹配的表。
命令grant(7) 和revoke(7) 用於設定訪問許可權。 參閱grant(7) 獲取更多資訊。
這是\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
Note: 注意: \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 或者其它事務控制命令的前面。
Note: 注意: 在關閉自動提交的模式下,你必須明確放棄任何失敗的事務,方法是執行 ABORT 或者 ROLLBACK。 還要注意如果你不提交就退出會話,你的工作會丟失。
Note: 注意: 自動提交開啟方式是 PostgreSQL 傳統的行為, 但是關閉自動提交更接近 SQL 規範。如果你喜歡關閉自動提交,你應該在你的.psqlrc 檔案裡設定它。
- DBNAME
-
你正在聯接著的資料庫名稱。 每次你與一個數據庫聯結都會設定這個值(包括程式啟動),但是可以刪除。 - ECHO
-
如果置為 all, 輸入的或者來自一個指令碼的所有行在分析或執行前都寫到標準輸出。 要在程式啟動時宣告這些,使用 -a如果設定為 queries, psql 只是在查詢傳送給伺服器之前打印出來。 實現這個功能的命令列選項是 -e。 - ECHO_HIDDEN
-
當設定了這個變數並且一個反斜槓命令查詢資料庫時,首先顯示查詢。 這樣你可以學習 PostgreSQL 內部的東西並且在你自己的程式裡提供類似功能。如果你設定該變數的值為 "noexec",查詢只是顯示出來但是實際上不傳送到伺服器和執行。 - ENCODING
-
當前的客戶端字符集編碼。 - HISTCONTROL
-
如果這個變數設定為 ignorespace, 以空格開始的行將不會進入歷史列表。 如果設定為變數 ignoredups, 與以前歷史記錄裡匹配的行也不會進入歷史記錄。值 ignoreboth是上面兩個的結合。 如果刪除此變數或者其值為任何與上面的值不同的東西, 所有互動模式讀入的行都被儲存入歷史列表。
Note: 注意: 這個特性是無恥地從bash 裡剽竊來的。
- HISTSIZE
-
存在命令歷史裡的命令的個數。預設值是 500。
Note: 注意: 這個特性是無恥地從bash 裡剽竊來的。
- HOST
-
當前你正聯接的資料庫伺服器主機。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除。 - IGNOREEOF
-
如果刪除此變數,向一個互動的 psql會話傳送一個 EOF (通常是Control+D)將終止應用。如果設定為一個數字值,那麼在應用終止前該數值的 EOF 字元將被忽略。 如果設定了此變數但是沒有數字值,預設是 10。
Note: 注意: 這個特性是無恥地從bash 裡剽竊來的。
- LASTOID
-
最後影響的oid值,即為從一條 INSERT 或 lo_insert 命令返回的值。 此變數只保證在下一條 SQL 命令的結果顯示之前有效。 - ON_ERROR_STOP
-
預設時,如果非互動的指令碼碰到一個錯誤,象一條錯誤的 SQL 命令或者內部元命令,處理會繼續進行。 這是 psql 的傳統特性, 但是有時候我們不太希望這樣。如果設定了這個變數,指令碼處理將馬上停止。 如果該指令碼是從另外一個指令碼呼叫的,那個指令碼也會按同樣的方式停止。 如果最外層的指令碼不是從一次互動的 psql 會話中呼叫的而是用 -f 選項呼叫的,psql 將返回錯誤程式碼 3,以示這個情況與致命錯誤條件的區別(錯誤程式碼 1)。 - PORT
-
當前你正在聯接的資料庫伺服器的埠。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除。 - PROMPT1
- PROMPT2
- PROMPT3
-
這些指明psql 顯示的提示符看上去象什麼。 參閱下面的 "Prompting 提示符"。 - QUIET
-
這個變數等效於命令列選項 -q。 可能在互動模式下沒有什麼用。 - SINGLELINE
-
這個變數等效於設定命令列選項 -S。你可以在執行時刪除或設定它。 - SINGLESTEP
-
這個變數等效於命令列選項-s。 - USER
-
當前你正用於聯接的資料庫使用者。 這是在每次你與資料庫聯接時(包括程式啟動)設定的,但是可以刪除/重置。 - VERBOSITY
-
這個選項可以設定為值 default,verbose,或者 terse 以控制錯誤報告的冗餘行。
一個附加的 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 擴充套件,因此有衝突。)