2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 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

SET

SET — 更改執行時引數

概要

SET [ SESSION | LOCAL ] configuration_parameter { TO | = } { value | 'value' | DEFAULT }
SET [ SESSION | LOCAL ] TIME ZONE { value | 'value' | LOCAL | DEFAULT }

描述

SET 命令用於更改執行時配置引數。在 第 19 章 中列出的許多執行時引數都可以透過 `SET` 動態更改。(某些引數只能由超級使用者和被授予了該引數 `SET` 許可權的使用者更改。還有一些引數在伺服器或會話啟動後就無法更改。)SET 隻影響當前會話使用的值。

如果在事務中執行了 `SET`(或等效的 `SET SESSION`),並且該事務之後被中止,那麼當事務回滾時,`SET` 命令的效果將消失。一旦包含的事務提交,除非被另一個 `SET` 覆蓋,否則其效果將一直持續到會話結束。

SET LOCAL 的效果僅持續到當前事務結束,無論事務是否提交。特殊情況是,在一個事務中先執行 `SET` 再執行 `SET LOCAL`:`SET LOCAL` 的值在事務結束前可見,但之後(如果事務提交)`SET` 的值將生效。

SET 或 `SET LOCAL` 的效果也會被回滾到一個比命令更早的儲存點而取消。

如果在具有相同變數的 `SET` 選項的函式中使用 `SET LOCAL`(請參閱 CREATE FUNCTION),則 `SET LOCAL` 命令的效果會在函式退出時消失;也就是說,無論如何都會恢復到呼叫函式時生效的值。這允許 `SET LOCAL` 用於在函式中動態或重複地更改引數,同時仍然可以方便地使用 `SET` 選項來儲存和恢復呼叫者的值。但是,常規的 `SET` 命令會覆蓋任何周圍函式的 `SET` 選項;其效果會持續存在,除非回滾。

注意

PostgreSQL 8.0 到 8.2 版本中,`SET LOCAL` 的效果會被提前釋放的儲存點或成功退出 `PL/pgSQL` 異常塊而取消。此行為已被更改,因為它被認為是不直觀的。

引數

SESSION

指定命令對當前會話生效。(如果既沒有出現 `SESSION` 也沒有出現 `LOCAL`,則這是預設值。)

LOCAL

指定命令僅對當前事務生效。在 `COMMIT` 或 `ROLLBACK` 之後,會話級別的設定將再次生效。在事務塊外發出此命令會發出警告,否則無效。

configuration_parameter

可設定的執行時引數的名稱。可用引數記錄在 第 19 章 及以下內容中。

value

引數的新值。值可以指定為字串常量、識別符號、數字或它們的逗號分隔列表,具體取決於特定引數的要求。可以寫 `DEFAULT` 來指定將引數重置為其預設值(即,如果當前會話中沒有執行任何 `SET` 命令,它將具有的任何值)。

除了 第 19 章 中記錄的配置引數外,還有一些只能使用 `SET` 命令調整,或者具有特殊語法的引數。

SCHEMA

SET SCHEMA 'value' 是 `SET search_path TO value` 的別名。使用此語法只能指定一個模式。

NAMES

SET NAMES 'value' 是 `SET client_encoding TO value` 的別名。

SEED

設定隨機數生成器(函式 `random`)的內部種子。允許的值是介於 -1 和 1 之間的浮點數。

透過呼叫函式 `setseed` 也可以設定種子。

SELECT setseed(value);
TIME ZONE

SET TIME ZONE 'value' 是 `SET timezone TO 'value'` 的別名。 `SET TIME ZONE` 語法允許時區規範的特殊語法。以下是一些有效值的示例:

'America/Los_Angeles'

伯克利,加利福尼亞州的時區。

'Europe/Rome'

義大利的時區。

-7

比 UTC 西偏 7 小時的時區(相當於 PDT)。正值表示比 UTC 東偏。

INTERVAL '-08:00' HOUR TO MINUTE

比 UTC 西偏 8 小時的時區(相當於 PST)。

LOCAL
DEFAULT

將時區設定為本地時區(即,伺服器預設的 `timezone` 值)。

以數字或間隔形式給出的時區設定在內部被轉換為 POSIX 時區語法。例如,在 `SET TIME ZONE -7` 之後,`SHOW TIME ZONE` 將報告 `<-07>+07`。

`SET` 不支援時區縮寫;有關時區的更多資訊,請參閱 8.5.3 節

註釋

函式 `set_config` 提供等效的功能;請參閱 9.28.1 節。此外,還可以透過更新 pg_settings 系統檢視來執行 `SET` 的等效操作。

示例

設定模式搜尋路徑

SET search_path TO my_schema, public;

設定日期風格為傳統的 POSTGRES,採用“日在前月在後”的輸入約定

SET datestyle TO postgres, dmy;

設定伯克利,加利福尼亞州的時區

SET TIME ZONE 'America/Los_Angeles';

設定義大利的時區

SET TIME ZONE 'Europe/Rome';

相容性

SET TIME ZONE 擴充套件了 SQL 標準中定義的語法。標準只允許數值時區偏移,而 PostgreSQL 允許更靈活的時區規範。所有其他 `SET` 功能都是 PostgreSQL 的擴充套件。

另請參閱

RESET, SHOW

提交更正

如果您在文件中發現任何不正確、與您對特定功能的使用體驗不符或需要進一步澄清的內容,請使用 此表格 來報告文件問題。