↑↓ 选择 ↵ 打开 ⌫ 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

受支持版本: 当前版本 (18) / 17 / 16 / 15 / 14
测试与开发版本: 19 / devel
不受支持的版本: 13 / 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 / 7.0 / 6.5 / 6.4
历史版本PostgreSQL 7.0 已于 2005 年 5 月结束社区维护,本页译文保留供仍在使用旧版本的读者参考。新系统请看当前版本。

SET

SET — 设置会话的运行时参数

大纲

SET variable { TO | = } { value | 'value' | DEFAULT }
SET CONSTRAINTS {ALL | constraintlist} mode
SET TIME ZONE { 'timezone' | LOCAL | DEFAULT }
SET TRANSACTION ISOLATION LEVEL { READ COMMITTED | SERIALIZABLE }
  

输入

variable

可设置的全局参数。

value

参数的新值。DEFAULT 可用于 指定把参数重置为默认 值。允许使用字符串列表,但更复杂的 构造可能需要加单引号或双引号。

可能的变量和允许的值有:

CLIENT_ENCODING | NAMES

设置多字节客户端编码。参数有:

value

把多字节客户端编码设为 value。 指定的编码必须为后端所支持。

只有在构建 Postgres 的 configure 步骤中启用了 MULTIBYTE 支持, 这个选项才可用。

DATESTYLE

设置日期/时间的表示风格。影响输出格式, 某些情况下也会影响输入的解释。

ISO

使用 ISO 8601 风格的日期和时间

SQL

使用 Oracle/Ingres 风格的日期和时间

Postgres

使用传统的 Postgres 格式

European

数值日期表示使用 dd/mm/yyyy。

NonEuropean

数值日期表示使用 mm/dd/yyyy。

German

数值日期表示使用 dd.mm.yyyy。

US

与 NonEuropean 相同

DEFAULT

恢复默认值(ISO)

日期格式的初始化可以通过以下方式完成:

设置 PGDATESTYLE 环境变量。 如果在基于 libpq 的客户端前端环境中设置了 PGDATESTYLE, libpq 会在连接启动时自动把 DATESTYLE 设为 PGDATESTYLE 的值。
使用选项 -o -e 运行 postmaster,把日期设为 European 约定。注意这只影响日期风格的 某些组合;例如 ISO 风格不受这个参数影响。
更改 src/backend/utils/init/globals.c.

globals.c 中可以更改的变量有:

bool EuroDates = false | true
int DateStyle = USE_ISO_DATES | USE_POSTGRES_DATES | USE_SQL_DATES | USE_GERMAN_DATES
SEED

设置随机数生成器的内部种子。

value

供 random 目录函数使用的种子 的值。有效的值是 0 到 1 之间的 浮点数,它们随后会与 RAND_MAX 相乘。 如果使用范围之外的数,该乘积会 静默溢出。

种子也可以通过调用 setseed SQL 函数来设置:

SELECT setseed(value);
            

只有在构建 Postgres 的 configure 步骤中启用了 MULTIBYTE 支持, 这个选项才可用。

SERVER_ENCODING

把多字节服务器编码设置为:

value

服务器编码的标识值。

只有在构建 Postgres 的 configure 步骤中启用了 MULTIBYTE 支持, 这个选项才可用。

CONSTRAINTS

SET CONSTRAINTS 影响当前事务中 约束求值的行为。 SET CONSTRAINTS 在 SQL3 中规定, 它允许下列参数:

constraintlist

以逗号分隔的可延迟约束名称列表。

mode

约束模式。允许的值是 DEFERRED 和 IMMEDIATE。

在 IMMEDIATE 模式下,外键约束 在每条查询结束时检查。

在 DEFERRED 模式下,标记为 DEFERRABLE 的外键约束只在 事务提交时检查,或者直到其模式被显式设为 IMMEDIATE。 实际上这只对外键约束实施,因此不适用于 UNIQUE 或其他约束。

TIME ZONE
TIME ZONE

timezone 的可用值取决于你的操作系统。例如在 Linux 上, /usr/lib/zoneinfo 包含时区数据库。

下面是一些有效的 timezone 值:

PST8PDT

把时区设为加利福尼亚州

Portugal

把时区设为葡萄牙。

'Europe/Rome'

把时区设为意大利。

DEFAULT

把时区设为你的本地时区 (即 TZ 环境变量的值)。

如果指定了无效的时区,时区 会变成 GMT(至少在大多数系统上如此)。

上面所示的第二种语法允许用与 SQL92 SET TIME ZONE 类似的语法 设置时区。LOCAL 关键字只是为兼容 SQL92 而提供的 DEFAULT 的另一种形式。

如果在基于 libpq 的客户端前端环境中设置了 PGTZ 环境变量,libpq 会在 连接启动时自动把 TIMEZONE 设为 PGTZ 的值。

TRANSACTION ISOLATION LEVEL

设置当前事务的隔离级别。

READ COMMITTED

当前事务的查询只读取 在查询开始之前已提交的行。READ COMMITTED 是默认值。

注意

SQL92 标准要求 SERIALIZABLE 为默认的隔离级别。

SERIALIZABLE

当前事务的查询只读取在本事务中 第一条 DML 语句 (SELECT/INSERT/DELETE/UPDATE/FETCH/COPY_TO) 执行之前已提交的行。

还有一些内部参数或优化参数也可以由 SET 命令指定:

PG_OPTIONS

设置各种后端参数。

RANDOM_PAGE_COST

设置优化器对非顺序获取磁盘页代价的估计。 它以顺序获取一页代价的倍数 来度量。

float8

把随机页面访问的代价 设为指定的浮点值。

CPU_TUPLE_COST

设置优化器对查询期间处理每个 元组代价的估计。它以顺序获取一页 代价的一个分数来度量。

float8

把每元组 CPU 处理的代价 设为指定的浮点值。

CPU_INDEX_TUPLE_COST

设置优化器对索引扫描期间处理每个 索引元组代价的估计。它以顺序获取一页 代价的一个分数来度量。

float8

把每索引元组 CPU 处理的代价 设为指定的浮点值。

CPU_OPERATOR_COST

设置优化器对处理 WHERE 子句中每个 操作符代价的估计。它以顺序获取一页 代价的一个分数来度量。

float8

把每操作符 CPU 处理的代价 设为指定的浮点值。

EFFECTIVE_CACHE_SIZE

设置优化器对磁盘缓存有效大小 (即内核磁盘缓存中会用于 Postgres 数据文件的那部分)的假设。它以磁盘 页为单位度量,通常每页 8KB。

float8

把假设的缓存大小 设为指定的浮点值。

ENABLE_SEQSCAN

启用或禁用规划器对顺序扫描计划类型的使用。 (不可能完全压制顺序扫描,但把这个 变量设为 OFF 会让规划器在还有 其他方法可用时不倾向于使用它。)

ON

启用顺序扫描的使用(默认设置)。

OFF

禁用顺序扫描。

ENABLE_INDEXSCAN

启用或禁用规划器对索引扫描计划类型的使用。

ON

启用索引扫描的使用(默认设置)。

OFF

禁用索引扫描。

ENABLE_TIDSCAN

启用或禁用规划器对 TID 扫描计划类型的使用。

ON

启用 TID 扫描的使用(默认设置)。

OFF

禁用 TID 扫描。

ENABLE_SORT

启用或禁用规划器对显式排序步骤的使用。 (不可能完全压制显式排序,但把这个 变量设为 OFF 会让规划器在还有 其他方法可用时不倾向于使用它。)

ON

启用排序的使用(默认设置)。

OFF

禁用排序。

ENABLE_NESTLOOP

启用或禁用规划器对嵌套循环连接计划的使用。 (不可能完全压制嵌套循环连接,但把这个 变量设为 OFF 会让规划器在还有 其他方法可用时不倾向于使用它。)

ON

启用嵌套循环连接的使用(默认设置)。

OFF

禁用嵌套循环连接。

ENABLE_MERGEJOIN

启用或禁用规划器对合并连接计划的使用。

ON

启用合并连接的使用(默认设置)。

OFF

禁用合并连接。

ENABLE_HASHJOIN

启用或禁用规划器对哈希连接计划的使用。

ON

启用哈希连接的使用(默认设置)。

OFF

禁用哈希连接。

GEQO

设置使用遗传优化器算法的阈值。

ON

对涉及 11 个或更多表的语句 启用遗传优化器算法。 (这也是 DEFAULT 设置。)

ON=#

接受一个整数参数,对查询中涉及 # 个或更多表的语句启用遗传优化器算法。

OFF

禁用遗传优化器算法。

关于查询优化的更多信息, 见程序员指南中的 GEQO 一章。

如果在基于 libpq 的客户端前端环境中设置了 PGGEQO 环境变量,libpq 会在 连接启动时自动把 GEQO 设为 PGGEQO 的值。

KSQO

键集查询优化器使查询 规划器把 WHERE 子句包含许多 OR 连接的 AND 子句(例如 "WHERE (a=1 AND b=2) OR (a=2 AND b=3) ...")的查询 转换为 UNION 查询。这种方法可能比默认 实现更快,但不一定给出完全相同的 结果,因为 UNION 隐式添加了 SELECT DISTINCT 子句来 消除相同的输出行。KSQO 常用于 配合 MicroSoft Access 之类的产品,它们往往生成这种形式的查询。

ON

启用这种优化。

OFF

禁用这种优化(默认设置)。

DEFAULT

等价于指定 SET KSQO=OFF。

KSQO 算法过去对带有许多 OR 连接 AND 子句的查询绝对必不可少,但在 Postgres 7.0 及以后 版本中标准规划器已经能相当好地处理这些查询。

MAX_EXPR_DEPTH

设置解析器可以接受的最大表达式嵌套深度。 默认值对任何正常查询都足够高, 但需要时可以调高。(但如果调得太高, 就有因栈溢出而导致后端崩溃的风险。)

integer

最大深度。

输出

SET VARIABLE

成功时返回的消息。

NOTICE: Bad value for variable (value)

如果命令未能设置指定的变量。

描述

SET 会在会话期间修改变量的配置参数。

当前值可以用 SHOW 获得,值可以 用 RESET 恢复为默认值。 参数和值不区分大小写。注意值 字段总是以字符串形式指定,因此用 单引号括起。

SET TIME ZONE 更改会话的 默认时区偏移。 SQL 会话总是以一个初始的默认时区 偏移开始。 SET TIME ZONE 语句用于更改当前 SQL 会话的默认 时区偏移。

注解

SET variable 语句是一种 Postgres 语言扩展。

请参阅 SHOW 和 RESET 来 显示或重置当前值。

用法

把日期样式设置为 ISO(参数不需要加引号):

SET DATESTYLE TO ISO;
   

为有 4 个或更多表的查询启用 GEQO(注意用 单引号处理值参数中的等号):

 
SET GEQO = 'ON=4';
   

把 GEQO 设为默认值:

 
SET GEQO = DEFAULT;
   

把时区设为加州伯克利,使用双引号保留 时区说明符的 大写属性:

 
SET TIME ZONE "PST8PDT";
SELECT CURRENT_TIMESTAMP AS today;
   
         today
------------------------
 1998-03-31 07:41:21-08

把时区设为意大利(注意需要用单引号或双引号处理 特殊字符):

 
SET TIME ZONE 'Europe/Rome';
SELECT CURRENT_TIMESTAMP AS today;
   
         today
------------------------
 1998-03-31 17:41:31+02

兼容性

SQL92

SQL92 中没有通用的 SET variable (除了 SET TRANSACTION ISOLATION LEVEL 之外)。 SQL92 中 SET TIME ZONE 的语法 略有不同, 只允许用单个整数值指定时区:

SET TIME ZONE { interval_value_expression | LOCAL }
    

提交更正

译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。