diff --git a/postgresql/doc/src/sgml/datatype.sgml b/postgresql/doc/src/sgml/datatype.sgml index a0817177..4a62ac83 100644 --- a/postgresql/doc/src/sgml/datatype.sgml +++ b/postgresql/doc/src/sgml/datatype.sgml @@ -1074,7 +1074,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 在随后的内容里,我们使用了下述术语:一个numericprecision(精度)是整个数中有效位的总数,也就是小数点两边的位数。numericscale(刻度)是小数部分的数字位数,也就是小数点右边的部分。因此数字 23.5141 的精度为6而刻度为4。可以认为整数的刻度为零。 + 在随后的内容里,我们使用了下述术语:一个numericprecision(精度)是整个数中有效位的总数,也就是小数点两边的位数。numericscale(小数位数)是小数部分的数字位数,也就是小数点右边的部分。因此数字 23.5141 的精度为6而小数位数为4。可以认为整数的小数位数为零。 - numeric列的最大精度和最大比例都是可以配置的。要声明一个类型为numeric的列,你可以用下面的语法: + numeric列的最大精度和最大小数位数都是可以配置的。要声明一个类型为numeric的列,你可以用下面的语法: NUMERIC(precision, scale) - 精度必须为正数,比例可以为零或者正数。另外: + 精度必须为正数,小数位数可以为零或者正数。另外: NUMERIC(precision) - 选择比例为 0 。如果使用 + 选择小数位数为 0 。如果使用 NUMERIC - 创建一个列时不使用精度或比例,则该列可以存储任何精度和比例的数字值,并且值的范围最多可以到实现精度的上限。一个这种列将不会把输入值转化成任何特定的比例,而带有比例声明的numeric列将把输入值转化为该比例(SQL标准要求缺省的比例是 0,即转化成整数精度。我们觉得这样做有点没用。如果你关心移植性,那你最好总是显式声明精度和比例)。 + 创建一个列时不使用精度或小数位数,则该列可以存储任何精度和小数位数的数字值,并且值的范围最多可以到实现精度的上限。一个这种列将不会把输入值转化成任何特定的小数位数,而带有小数位数声明的numeric列将把输入值转化为该小数位数(SQL标准要求缺省的小数位数是 0,即转化成整数精度。我们觉得这样做有点没用。如果你关心移植性,那你最好总是显式声明精度和小数位数)。 @@ -1147,7 +1147,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 如果一个要存储的值的比例比列声明的比例高,那么系统将尝试圆整(四舍五入)该值到指定的分数位数。 然后,如果小数点左边的位数超过了声明的精度减去声明的比例,那么抛出一个错误。 + 如果一个要存储的值的小数位数比列声明的小数位数高,那么系统将尝试圆整(四舍五入)该值到指定的分数位数。 然后,如果小数点左边的位数超过了声明的精度减去声明的小数位数,那么抛出一个错误。 ____________________________________________________________________________--> - 数字值在物理上是以不带任何前导或者后缀零的形式存储。 因此,列上声明的精度和比例都是最大值,而不是固定分配的 (在这个方面,numeric类型更类似于varchar(n), 而不像char(n))。 实际存储要求是每四个十进制位组用两个字节,再加上三到八个字节的开销。 + 数字值在物理上是以不带任何前导或者后缀零的形式存储。 因此,列上声明的精度和小数位数都是最大值,而不是固定分配的 (在这个方面,numeric类型更类似于varchar(n), 而不像char(n))。 实际存储要求是每四个十进制位组用两个字节,再加上三到八个字节的开销。 ____________________________________________________________________________--> - 本章包含了如何创建用来保存数据的数据库结构。在一个关系型数据库中,原始数据被存储在表中,因此本章的主要工作就是解释如何创建和修改表,以及哪些特性可以控制何种数据会被存储在表中。接着,我们讨论表如何被组织成模式,以及如何将权限分配给表。最后,我们将将简短地介绍其他一些影响数据存储的特性,例如继承、表分区、视图、函数和触发器。 + 本章包含了如何创建用来保存数据的数据库结构。在一个关系型数据库中,原始数据被存储在表中,因此本章的主要工作就是解释如何创建和修改表,以及哪些特性可以控制何种数据会被存储在表中。接着,我们讨论表如何被阻止成模式,以及如何将权限分配给表。最后,我们将将简短地介绍其他一些影响数据存储的特性,例如继承、表分区、视图、函数和触发器。 @@ -1848,7 +1848,7 @@ CREATE TABLE order_items ( ____________________________________________________________________________--> - 限制删除或者级联删除是两种最常见的选项。RESTRICT阻止删除一个被引用的行。NO ACTION表示在约束被检察时如果有任何引用行存在,则会抛出一个错误,这是我们没有指定任何东西时的默认行为(这两种选择的本质不同在于NO ACTION允许检查被推迟到事务的最后,而RESTRICT则不会)。CASCADE指定当一个被引用行被删除后,引用它的行也应该被自动删除。还有其他两种选项:SET NULLSET DEFAULT。这些将导致在被引用行被删除后,引用行中的引用列被置为空值或它们的默认值。注意这些并不会是我们免于遵守任何约束。例如,如果一个动作指定了SET DEFAULT,但是默认值不满足外键约束,操作将会失败。 + 限制删除或者级联删除是两种最常见的选项。RESTRICT阻止删除一个被引用的行。NO ACTION表示在约束被检查时如果有任何引用行存在,则会抛出一个错误,这是我们没有指定任何东西时的默认行为(这两种选择的本质不同在于NO ACTION允许检查被推迟到事务的最后,而RESTRICT则不会)。CASCADE指定当一个被引用行被删除后,引用它的行也应该被自动删除。还有其他两种选项:SET NULLSET DEFAULT。这些将导致在被引用行被删除后,引用行中的引用列被置为空值或它们的默认值。注意这些并不会是我们免于遵守任何约束。例如,如果一个动作指定了SET DEFAULT,但是默认值不满足外键约束,操作将会失败。 ____________________________________________________________________________--> - 继承的查询仅在附表上执行访问权限检查。例如,在cities表上授予UPDATE权限也隐含着通过cities访问时在capitals表中更新行的权限。 + 继承的查询仅在父表上执行访问权限检查。例如,在cities表上授予UPDATE权限也隐含着通过cities访问时在capitals表中更新行的权限。 这保留了数据(也)在父表中的样子。但是如果没有额外的授权,则不能直接更新capitals表。 以类似的方式,父表的行安全性策略(见)适用于继承查询期间来自于子表的行。 只有当子表在查询中被明确提到时,其策略(如果有)才会被应用,在那种情况下,附着在其父表上的任何策略都会被忽略。 @@ -8012,7 +8012,7 @@ ____________________________________________________________________________--> - 没有自动的方法啊验证所有的CHECK约束之间是否互斥。编写代码来产生子表以及创建和修改相关对象比手写命令要更加安全。 + 没有自动的方法验证所有的CHECK约束之间是否互斥。编写代码来产生子表以及创建和修改相关对象比手写命令要更加安全。 @@ -8479,9 +8479,9 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 最重要的设计决策之一是列或者如和对数据进行分区的。 - 通常最佳选择是按列或列集合进行分区,这些列最常出现在分区表上执行的查询的 WHERE子句中。 - WHERE子句项与分区键匹配并兼容,可用于裁剪不需要的分区。 + 最重要的设计决策之一是选择对数据进行分区的列或者列的组合。 + 通常最佳选择是按最常出现在分区表上执行的查询的 WHERE子句中的列或列集合进行分区。 + 与分区键匹配并兼容的WHERE子句项可用于裁剪不需要的分区。 但是,你可能会被迫根据PRIMARY KEYUNIQUE约束的要求做出其他决策。 在规划分区策略时,删除不需要的数据也是需要考虑的一个因素。 可以相当快地分离整个分区,因此采用这样方式设计分区策略可能是有益的,既把一次删除的所有数据都放在单个分区中。 diff --git a/postgresql/doc/src/sgml/extend.sgml b/postgresql/doc/src/sgml/extend.sgml index 774ab651..e307310d 100644 --- a/postgresql/doc/src/sgml/extend.sgml +++ b/postgresql/doc/src/sgml/extend.sgml @@ -141,7 +141,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 此外,PostgreSQL服务器能够通过动态载入把用户编写的代码结合到它自身中。也就是,用户能够指定一个实现了一个新类型或函数的对象代码文件(例如一个共享库),并且PostgreSQL将按照要求载入它。把用SQL编写的代码加入到服务器会更繁琐。这种即时修改其操作的能力让PostgreSQL独特地适合新应用和存储结构的快速原型设计。 + 此外,PostgreSQL服务器能够通过动态载入把用户编写的代码结合到它自身中。也就是,用户能够指定一个实现了一个新类型或函数的对象代码文件(例如一个共享库),并且PostgreSQL将按照要求载入它。把用SQL编写的代码加入到服务器会更加轻而易举。这种即时修改其操作的能力让PostgreSQL独特地适合新应用和存储结构的快速原型设计。 @@ -649,7 +649,7 @@ ____________________________________________________________________________--> 此外,如果有位置被声明为anyarray并且其他位置被声明为anyelementanyarray位置中的实际数组类型必须是一个数组,该数组的元素都是出现在anyelement位置的同一种类型。 相似地,如果有位置被声明为anyrange并且其他位置被声明为anyelementanyarrayanyrange位置的实际范围类型必须是一个范围,该范围的子类型是出现在anyelement位置的同一种类型,并且与 anyarray 位置的元素类型相同。 anynonarray被当做和anyelement相同,但是增加了额外的约束要求实际类型不能是一种数组类型。 - anyenum被当做和anyelement相同,但是增加了额外的约束要求实际类型不能是一种枚举类型。 + anyenum被当做和anyelement相同,但是增加了额外的约束要求实际类型必须是一种枚举类型。 - PostgreSQL同样也提供了返回当前语句开始时间的函数, 它们会返回函数被调用时的真实当前时间。这些非 SQL 标准的函数列表如下: + PostgreSQL还提供了返回当前语句的开始时间以及 + 调用该函数时的实际当前时间的函数。这些非 SQL 标准的函数列表如下: transaction_timestamp() statement_timestamp() diff --git a/postgresql/doc/src/sgml/legal.sgml b/postgresql/doc/src/sgml/legal.sgml index 7aacad8a..21bcb50b 100644 --- a/postgresql/doc/src/sgml/legal.sgml +++ b/postgresql/doc/src/sgml/legal.sgml @@ -1,6 +1,6 @@ -2019 +2020 1996–2020 @@ -56,11 +56,11 @@ - PostgreSQL版权 © 1996-2019为PostgreSQL全球开发组所有。 + PostgreSQL版权 © 1996–2020为PostgreSQL全球开发组所有。 - Postgres95版权 © 1994-5为加利福尼亚大学董事会所有。 + Postgres95版权 © 1994–5为加利福尼亚大学董事会所有。 diff --git a/postgresql/doc/src/sgml/libpq.sgml b/postgresql/doc/src/sgml/libpq.sgml index 2f814e4f..f1064136 100644 --- a/postgresql/doc/src/sgml/libpq.sgml +++ b/postgresql/doc/src/sgml/libpq.sgml @@ -1160,7 +1160,7 @@ switch(PQstatus(conn)) - 在使用PQconnectPoll时,连接参数connect_timeout会被忽略:判断是否超时是应用的责任。否则,PQconnectStart后面跟着后面跟着PQconnectPoll循环等效于。 + 在使用PQconnectPoll时,连接参数connect_timeout会被忽略:判断是否超时是应用的责任。否则,PQconnectStart后面跟着PQconnectPoll循环等效于 diff --git a/postgresql/doc/src/sgml/queries.sgml b/postgresql/doc/src/sgml/queries.sgml index e7e2d19c..ff9da8a5 100644 --- a/postgresql/doc/src/sgml/queries.sgml +++ b/postgresql/doc/src/sgml/queries.sgml @@ -3626,7 +3626,7 @@ ____________________________________________________________________________--> RECURSIVE in common table expressions - 可选的RECURSIVE修饰符将WITH从单纯的句法便利变成了一种在标准SQL中不能完成的特性。通过使用RECURSIVE,一个WITH查询可以引用它自己的输出。一个非常简单的例子是计算从1到100的整数合的查询: + 可选的RECURSIVE修饰符将WITH从单纯的句法便利变成了一种在标准SQL中不能完成的特性。通过使用RECURSIVE,一个WITH查询可以引用它自己的输出。一个非常简单的例子是计算从1到100的整数和的查询: WITH RECURSIVE t(n) AS ( @@ -3832,7 +3832,7 @@ WITH RECURSIVE search_graph(id, link, data, depth) AS ( SELECT * FROM search_graph; - 如果link关系包含环,这个查询将会循环。因为我们要求一个depth输出,仅仅将UNION ALL 改为UNION不会消除循环。反过来在我们顺着一个特定链接路径搜索时,我们需要识别我们是否再次到达了一个相同的行。我们可以项这个有循环倾向的查询增加两个列pathcycle: + 如果link关系包含环,这个查询将会循环。因为我们要求一个depth输出,仅仅将UNION ALL 改为UNION不会消除循环。反过来在我们顺着一个特定链接路径搜索时,我们需要识别我们是否再次到达了一个相同的行。我们可以向这个有循环倾向的查询增加两个列pathcycle WITH RECURSIVE search_graph(id, link, data, depth, path, cycle) AS ( diff --git a/postgresql/doc/src/sgml/ref/checkpoint.sgml b/postgresql/doc/src/sgml/ref/checkpoint.sgml index 5358dfc0..adfb6846 100644 --- a/postgresql/doc/src/sgml/ref/checkpoint.sgml +++ b/postgresql/doc/src/sgml/ref/checkpoint.sgml @@ -34,7 +34,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> CHECKPOINT - 强制一个事务日志检查点 + 强制一个WAL日志检查点 @@ -64,7 +64,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 一个检查点是事务日志序列中的一个点,在该点上所有数据文件 + 一个检查点是WAL日志序列中的一个点,在该点上所有数据文件 都已经被更新为反映日志中的信息。所有数据文件将被刷写到磁盘。 检查点期间发生的细节可见 diff --git a/postgresql/doc/src/sgml/ref/clusterdb.sgml b/postgresql/doc/src/sgml/ref/clusterdb.sgml index 4e937a8e..556d0ae2 100644 --- a/postgresql/doc/src/sgml/ref/clusterdb.sgml +++ b/postgresql/doc/src/sgml/ref/clusterdb.sgml @@ -621,7 +621,7 @@ ____________________________________________________________________________--> 要聚簇在数据库xyzzy中的一个表foo -$ clusterdb --table foo xyzzy +$ clusterdb --table=foo xyzzy diff --git a/postgresql/doc/src/sgml/ref/discard.sgml b/postgresql/doc/src/sgml/ref/discard.sgml index 60942064..78cd51dc 100644 --- a/postgresql/doc/src/sgml/ref/discard.sgml +++ b/postgresql/doc/src/sgml/ref/discard.sgml @@ -169,15 +169,15 @@ ____________________________________________________________________________--> 释放与当前会话相关的所有临时资源并且把会话重置为初始状态。 当前这和执行以下语句序列的效果相同: +CLOSE ALL; SET SESSION AUTHORIZATION DEFAULT; RESET ALL; DEALLOCATE ALL; -CLOSE ALL; UNLISTEN *; SELECT pg_advisory_unlock_all(); DISCARD PLANS; -DISCARD SEQUENCES; DISCARD TEMP; +DISCARD SEQUENCES; diff --git a/postgresql/doc/src/sgml/ref/do.sgml b/postgresql/doc/src/sgml/ref/do.sgml index 79222d90..343937a0 100644 --- a/postgresql/doc/src/sgml/ref/do.sgml +++ b/postgresql/doc/src/sgml/ref/do.sgml @@ -93,7 +93,7 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 可选的LANGUAGE子句可以卸载代码块之前或者之后。 + 可选的LANGUAGE子句可以写在代码块之前或者之后。 diff --git a/postgresql/doc/src/sgml/ref/pg_restore.sgml b/postgresql/doc/src/sgml/ref/pg_restore.sgml index de95d96e..f89b110d 100644 --- a/postgresql/doc/src/sgml/ref/pg_restore.sgml +++ b/postgresql/doc/src/sgml/ref/pg_restore.sgml @@ -947,7 +947,7 @@ ____________________________________________________________________________--> - + diff --git a/postgresql/doc/src/sgml/ref/pgupgrade.sgml b/postgresql/doc/src/sgml/ref/pgupgrade.sgml index 8bc377ad..739df0ae 100644 --- a/postgresql/doc/src/sgml/ref/pgupgrade.sgml +++ b/postgresql/doc/src/sgml/ref/pgupgrade.sgml @@ -103,11 +103,11 @@ ____________________________________________________________________________--> ____________________________________________________________________________--> - 主 PostgreSQL 发行通常会加入新的特性,这些新特性常常会更改系统表的 + PostgreSQL主发行版本通常会加入新的特性,这些新特性常常会更改系统表的 布局,但是内部数据存储格式很少会改变。pg_upgrade 使用这一事实来通过创建新系统表并且重用旧的用户数据文件来执行快速升级。 - 如果一个未来的主发行没有把数据存储格式改得让旧数据格式不可读取,这类 - 升级就用不上pg_upgrade(社区将尝试避免这类情况)。 + 如果未来的主发行版本更改了数据存储格式,导致旧数据格式不可读,那么 + pg_upgrade将无法用于此类升级。(社区将努力避免这种情况)。 要清理在名为xyzzy的数据库中的一个表foo,并且为优化器分析该表的bar列: -$ vacuumdb --analyze --verbose --table 'foo(bar)' xyzzy +$ vacuumdb --analyze --verbose --table='foo(bar)' xyzzy diff --git a/postgresql/doc/src/sgml/rules.sgml b/postgresql/doc/src/sgml/rules.sgml index 125ea48e..400e661d 100644 --- a/postgresql/doc/src/sgml/rules.sgml +++ b/postgresql/doc/src/sgml/rules.sgml @@ -3777,7 +3777,7 @@ ____________________________________________________________________________--> CREATE VIEW phone_number WITH (security_barrier) AS SELECT person, phone FROM phone_data WHERE phone NOT LIKE '412%'; - Views created with the 使用security_barrier创建的视图的性能会远差于没有使用该选项的视图。通常,没有办法来避免这种现状:如果最快的候选计划可能在安全性上折衷,它就必须被拒绝。出于该原因,这个选在在默认情况下是没有启用的。 + 使用security_barrier创建的视图的性能会远差于没有使用该选项的视图。通常,没有办法来避免这种现状:如果最快的候选计划可能在安全性上折衷,它就必须被拒绝。出于该原因,这个选在在默认情况下是没有启用的。 ____________________________________________________________________________--> - 在PostgreSQL中有三种隐式类型常量:字符串、位串和数字。常量也可以被指定显示类型,这可以使得它被更精确地展示以及更有效地处理。这些选择将会在后续小节中讨论。 + 在PostgreSQL中有三种隐式类型常量:字符串、位串和数字。常量也可以被指定显式类型,这可以使得它被更精确地展示以及更有效地处理。这些选择将会在后续小节中讨论。 diff --git a/postgresql/doc/src/sgml/test-decoding.sgml b/postgresql/doc/src/sgml/test-decoding.sgml index c1cbbc7d..e75433fb 100644 --- a/postgresql/doc/src/sgml/test-decoding.sgml +++ b/postgresql/doc/src/sgml/test-decoding.sgml @@ -65,7 +65,7 @@ ____________________________________________________________________________--> postgres=# SELECT * FROM pg_logical_slot_get_changes('test_slot', NULL, NULL, 'include-xids', '0'); - location | xid | data + lsn | xid | data -----------+-----+-------------------------------------------------- 0/16D30F8 | 691 | BEGIN 0/16D32A0 | 691 | table public.data: INSERT: id[int4]:2 data[text]:'arg'