Skip to content

Commit ba782ad

Browse files
authored
Merge pull request #411 from sizhitu/master
doc: update json.sgml等
2 parents 9e1077d + 0a8ff0d commit ba782ad

File tree

8 files changed

+443
-140
lines changed

8 files changed

+443
-140
lines changed

postgresql/doc/src/sgml/json.sgml

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ ____________________________________________________________________________-->
127127
</para>
128128
____________________________________________________________________________-->
129129
<para>
130-
RFC 7159 指定 JSON 字符串应以 UTF8 编码。因此 JSON 类型不可能严格遵守 JSON 规范,除非数据库编码
130+
<acronym>RFC</acronym> 7159 指定 JSON 字符串应以 UTF8 编码。因此 JSON 类型不可能严格遵守 JSON 规范,除非数据库编码
131131
是 UTF8。尝试直接包括数据库编码中无法表示的字符将会失败。反过来,能
132132
在数据库编码中表示但是不在 UTF8 中的字符是被允许的。
133133
</para>
@@ -151,7 +151,7 @@ ____________________________________________________________________________-->
151151
</para>
152152
____________________________________________________________________________-->
153153
<para>
154-
RFC 7159 允许 JSON 字符串包含<literal>\u<replaceable>XXXX</replaceable></literal>
154+
<acronym>RFC</acronym> 7159 允许 JSON 字符串包含<literal>\u<replaceable>XXXX</replaceable></literal>
155155
所标记的 Unicode 转义序列。在<type>json</type>类型的输入函数中,不管数据库
156156
编码如何都允许 Unicode 转义,并且只检查语法正确性(即,跟在<literal>\u</literal>
157157
后面的四个十六进制位)。但是,<type>jsonb</type>的输入函数更加严格:它不允许对无法在数据库
@@ -956,7 +956,7 @@ ____________________________________________________________________________-->
956956
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] == "qui"';
957957
</programlisting>
958958
<programlisting>
959-
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @? '$.tags[*] ? (@ == "qui")';
959+
SELECT jdoc->'guid', jdoc->'name' FROM api WHERE jdoc @@ '$.tags[*] ? (@ == "qui")';
960960
</programlisting>
961961
GIN 索引从<literal>jsonpath</literal>中提取如下格式的语句: <replaceable>accessors_chain</replaceable> = <replaceable>const</replaceable>。
962962
存取器链可能由<literal>.key</literal><literal>[*]</literal>, 和 <literal>[<replaceable>index</replaceable>]</literal> 存取器组成。
@@ -1152,6 +1152,78 @@ ____________________________________________________________________________-->
11521152
</para>
11531153
</sect2>
11541154

1155+
<sect2 id="jsonb-subscripting">
1156+
<title><type>jsonb</type> 下标</title>
1157+
<para>
1158+
<type>jsonb</type> 数据类型支持用于检索和修改元素的数组样式索引。 嵌套值与 <literal>jsonb_set</literal> 函数中<literal>path</literal>参数规则相同,可以被链式下标表达式指定。如果<type>jsonb</type>
1159+
类型的值是一个数组,数值下标从零开始,负整数从数组的最后的元素倒数。 不支持切片表达式。下标表达式的结果始终是 jsonb 数据类型。
1160+
</para>
1161+
1162+
<para>
1163+
<command>UPDATE</command> 语句或许在
1164+
<literal>SET</literal> 子句中使用下标来修改 <type>jsonb</type> 值。下标路径必须对它存在范围内的所有受影响的值都是可遍历的。 例如,<literal>val</literal>,<literal>val['a']</literal>,和 <literal>val['a']['b']</literal>如果每个路径都是一个对象, 则<literal>val['a']['b']['c']</literal>路径可以一直被遍历访问到 <literal>c</literal>, 如果 <literal>val['a']</literal> 或者 <literal>val['a']['b']</literal>
1165+
中任何一个没有定义, 将创建为空对象并根据需要进行填充。 但是, 如果 <literal>val</literal> 本身或者其中任何一个中间值被定义为非对象, 例如 字符串, 数字,或者<literal>jsonb</literal> <literal>null</literal>等,将无法访问并发生错误,事务将中止。
1166+
</para>
1167+
1168+
<para>
1169+
下标语法的例子:
1170+
1171+
<programlisting>
1172+
1173+
-- -- 通过键获取对象值
1174+
SELECT ('{"a": 1}'::jsonb)['a'];
1175+
1176+
-- 通过键路径提取嵌套对象的值
1177+
SELECT ('{"a": {"b": {"c": 1}}}'::jsonb)['a']['b']['c'];
1178+
1179+
-- 通过索引获取数组元素
1180+
SELECT ('[1, "2", null]'::jsonb)[1];
1181+
1182+
-- 按键更新对象值。请注意“1”周围的单引号。
1183+
-- 赋值的值也必须是jsonb类型
1184+
UPDATE table_name SET jsonb_field['key'] = '1';
1185+
1186+
-- 如果 jsonb_field['a']['b'] 中的任何数据不是对象,这将导致错误。
1187+
-- 例如,值 {"a": 1} 具有键 'a' 的数值。
1188+
UPDATE table_name SET jsonb_field['a']['b']['c'] = '1';
1189+
1190+
-- 在 WHERE 子句中使用下标过滤数据。
1191+
-- 由于下标的结果是jsonb,所以要与之比较的值也一定是jsonb。
1192+
-- 双引号还使“值”成为有效的 jsonb 字符串。
1193+
SELECT * FROM table_name WHERE jsonb_field['key'] = '"value"';
1194+
</programlisting>
1195+
1196+
<type>jsonb</type>不同于 <literal>jsonb_set</literal>,通过下标赋值处理边界情况. 当源值 <type>jsonb</type>
1197+
是 <literal>NULL</literal>时, 赋值通过下标处理,
1198+
好像是空JSON值 类型(对象或数组)隐含在下标键中:
1199+
1200+
<programlisting>
1201+
-- 如果 jsonb_field 为 NULL,返回结果将是 {"a": 1}
1202+
UPDATE table_name SET jsonb_field['a'] = '1';
1203+
1204+
-- 如果 jsonb_field 为 NULL,返回结果将是 [1]
1205+
UPDATE table_name SET jsonb_field[0] = '1';
1206+
</programlisting>
1207+
如果您为缺少元素的数组指定索引,则会添加<literal>NULL</literal> 元素, 直到索引可达并且可以设置值。
1208+
<programlisting>
1209+
-- 如果 jsonb_field 是 [] 返回结果是 [null, null, 2],
1210+
-- 如果 jsonb_field 是 [0],返回结果是 [0, null, 2]
1211+
UPDATE table_name SET jsonb_field[2] = '2';
1212+
</programlisting>
1213+
1214+
<type>jsonb</type> 值接受赋值给不存在的下标路径,只要最后一个可以被访问到的元素是一个对象或者数组 ,正如相应的下标所暗示的那样。(没有访问到路径中最后一个下标指定的元素,可能是任何值)创建嵌套数组或对象结构,如在前面的例子中,指定的下标路径用 <literal>null</literal>填充
1215+
1216+
<programlisting>
1217+
-- 如果 jsonb_field 是 {},返回结果是 {"a": [{"b": 1}]}
1218+
UPDATE table_name SET jsonb_field['a'][0]['b'] = '1';
1219+
1220+
-- 如果 jsonb_field 为 [],返回结果是 [null, {"a": 1}]
1221+
UPDATE table_name SET jsonb_field[1]['a'] = '1';
1222+
</programlisting>
1223+
1224+
</para>
1225+
</sect2>
1226+
11551227
<sect2>
11561228
<!--==========================orignal english content==========================
11571229
<title>Transforms</title>

postgresql/doc/src/sgml/logical-replication.sgml

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ ____________________________________________________________________________-->
224224
fallback if no other solution is possible. If a replica identity other
225225
than <quote>full</quote> is set on the publisher side, a replica identity
226226
comprising the same or fewer columns must also be set on the subscriber
227-
side. See <xref linkend="sql-createtable-replica-identity"/> for details on
227+
side. See <xref linkend="sql-altertable-replica-identity"/> for details on
228228
how to set the replica identity. If a table without a replica identity is
229229
added to a publication that replicates <command>UPDATE</command>
230230
or <command>DELETE</command> operations then
@@ -234,7 +234,7 @@ ____________________________________________________________________________-->
234234
</para>
235235
____________________________________________________________________________-->
236236
<para>
237-
为了能够复制<command>UPDATE</command>和<command>DELETE</command>操作,被发布的表必须配置有一个<quote>复制标识</quote>,这样在订阅者那一端才能标识对于更新或删除合适的行。默认情况下,复制标识就是主键(如果有主键)。也可以在复制标识上设置另一个唯一索引(有特定的额外要求)。如果表没有合适的键,那么可以设置成复制标识<quote>full</quote>,它表示整个行都成为那个键。不过,这样做效率很低,只有在没有其他方案的情况下才应该使用。如果在发布者端设置了<quote>full</quote>之外的复制标识,在订阅者端也必须设置一个复制标识,它应该由相同的或者少一些的列组成。如何设置复制标识的细节请参考<xref linkend="sql-createtable-replica-identity"/>。如果在复制<command>UPDATE</command>或<command>DELETE</command>操作的发布中加入了没有复制标识的表,那么订阅者上后续的<command>UPDATE</command>或<command>DELETE</command>操作将导致错误。不管有没有复制标识,<command>INSERT</command>操作都能继续下去。
237+
为了能够复制<command>UPDATE</command>和<command>DELETE</command>操作,被发布的表必须配置有一个<quote>复制标识</quote>,这样在订阅者那一端才能标识对于更新或删除合适的行。默认情况下,复制标识就是主键(如果有主键)。也可以在复制标识上设置另一个唯一索引(有特定的额外要求)。如果表没有合适的键,那么可以设置成复制标识<quote>full</quote>,它表示整个行都成为那个键。不过,这样做效率很低,只有在没有其他方案的情况下才应该使用。如果在发布者端设置了<quote>full</quote>之外的复制标识,在订阅者端也必须设置一个复制标识,它应该由相同的或者少一些的列组成。如何设置复制标识的细节请参考<xref linkend="sql-altertable-replica-identity"/>。如果在复制<command>UPDATE</command>或<command>DELETE</command>操作的发布中加入了没有复制标识的表,那么订阅者上后续的<command>UPDATE</command>或<command>DELETE</command>操作将导致错误。不管有没有复制标识,<command>INSERT</command>操作都能继续下去。
238238
</para>
239239

240240
<!--==========================orignal english content==========================
@@ -253,7 +253,7 @@ ____________________________________________________________________________-->
253253
</para>
254254
____________________________________________________________________________-->
255255
<para>
256-
Publication通过使用<xref linkend="sql-createpublication"/>命令创建并且可以在之后使用相应的命令进行修改或者删除。
256+
Publication通过使用<link linkend="sql-createpublication"><command>CREATE PUBLICATION</command></link>命令创建并且可以在之后使用相应的命令进行修改或者删除。
257257
</para>
258258

259259
<!--==========================orignal english content==========================
@@ -266,7 +266,7 @@ ____________________________________________________________________________-->
266266
</para>
267267
____________________________________________________________________________-->
268268
<para>
269-
表可以使用<xref linkend="sql-alterpublication"/>动态地增加或者移除。<literal>ADD TABLE</literal>以及<literal>DROP TABLE</literal>操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。
269+
表可以使用<link linkend="sql-alterpublication"><command>ALTER PUBLICATION</command></link>动态地增加或者移除。<literal>ADD TABLE</literal>以及<literal>DROP TABLE</literal>操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。
270270
</para>
271271
</sect1>
272272

@@ -321,7 +321,7 @@ ____________________________________________________________________________-->
321321
</para>
322322
____________________________________________________________________________-->
323323
<para>
324-
每一个订阅都将通过一个复制槽(见<xref linkend="streaming-replication-slots"/>)接收更改。预先存在的表数据的初始数据同步过程可能会要求额外的临时复制槽
324+
每一个订阅都将通过一个复制槽(见<xref linkend="streaming-replication-slots"/>)接收更改。预先存在的表数据的初始数据同步过程可能会要求额外的复制槽,并且在数据同步结束后删除
325325
</para>
326326

327327
<!--==========================orignal english content==========================
@@ -358,7 +358,7 @@ ____________________________________________________________________________-->
358358
</para>
359359
____________________________________________________________________________-->
360360
<para>
361-
可以使用<xref linkend="sql-createsubscription"/>增加订阅,并且使用<xref linkend="sql-altersubscription"/>在任何时刻停止/继续订阅,还可以使用<xref linkend="sql-dropsubscription"/>删除订阅。
361+
可以使用<link linkend="sql-createsubscription"><command>CREATE SUBSCRIPTION</command></link>增加订阅,并且使用<link linkend="sql-altersubscription"><command>ALTER SUBSCRIPTION</command></link>在任何时刻停止/继续订阅,还可以使用<link linkend="sql-dropsubscription"><command>DROP SUBSCRIPTION</command></link>删除订阅。
362362
</para>
363363

364364
<!--==========================orignal english content==========================
@@ -479,7 +479,15 @@ ____________________________________________________________________________-->
479479
</para>
480480
____________________________________________________________________________-->
481481
<para>
482-
如早前所提到的,每一个(活跃的)订阅会从远(发布)端上的一个复制槽接收更改。通常,远程复制槽是在使用<command>CREATE SUBSCRIPTION</command>创建订阅是自动创建的,并且在使用<command>DROP SUBSCRIPTION</command>删除订阅时,复制槽也会自动被删除。不过,在一些情况下,有必要单独操纵订阅以及其底层的复制槽。下面是一些场景:
482+
如早前所提到的,每一个(活跃的)订阅会从远(发布)端上的一个复制槽接收更改。
483+
</para>
484+
<para>
485+
额外的表同步槽通常是临时的,在内部创建以执行初始表同步,并在它们不再被需要时自动删除。这些表同步槽命名为: <quote><literal>pg_%u_sync_%u_%llu</literal></quote>
486+
(参数是: Subscription <parameter>oid</parameter>,
487+
Table <parameter>relid</parameter>, system identifier <parameter>sysid</parameter>)
488+
</para>
489+
<para>
490+
通常,远程复制槽是在使用<command>CREATE SUBSCRIPTION</command>创建订阅是自动创建的,并且在使用<command>DROP SUBSCRIPTION</command>删除订阅时,复制槽也会自动被删除。不过,在一些情况下,有必要单独操纵订阅以及其底层的复制槽。下面是一些场景:
483491

484492
<itemizedlist>
485493
<listitem>
@@ -502,7 +510,7 @@ ____________________________________________________________________________-->
502510

503511
<listitem>
504512
<para>
505-
在删除一个订阅是,远程主机不可达。在这种情况下,可以在尝试删除该订阅之前,使用<command>ALTER SUBSCRIPTION</command>将复制槽解除关联。如果远程数据库实例不再存在,那么不需要进一步的行动。不过,如果远程数据库实例只是不可达,那么复制槽应该被手动删除。否则它将会继续保留WAL并且最终可能会导致磁盘被填满。这种情况应该要仔细地研究。
513+
在删除一个订阅时,远程主机不可达。在这种情况下,可以在尝试删除该订阅之前,使用<command>ALTER SUBSCRIPTION</command>将复制槽解除关联。如果远程数据库实例不再存在,那么不需要进一步的行动。不过,如果远程数据库实例只是不可达,那么复制槽应该被手动删除(以及任何剩余的表同步槽)。否则它将会继续保留WAL并且最终可能会导致磁盘被填满。这种情况应该要仔细地研究。
506514
</para>
507515
</listitem>
508516
</itemizedlist>
@@ -681,7 +689,7 @@ ____________________________________________________________________________-->
681689
<para>
682690
在分区表之间进行复制时,实际的复制来源,缺省情况下,源自发布者上的叶子分区,因此发布者上的分区也必须作为有效的目标表存在于订阅者上。
683691
(它们可以是叶分区本身,也可以是进一步子分区段,甚至可以是独立的表。)
684-
发布还可以指定使用已分区根表的标识和模式来复制更改,而不是使用实际产生更改的各个叶分区的标识和模式(参见<xref linkend="sql-createpublication"/>)。
692+
发布还可以指定使用已分区根表的标识和模式来复制更改,而不是使用实际产生更改的各个叶分区的标识和模式(参见<link linkend="sql-createpublication"><command>CREATE PUBLICATION</command></link>)。
685693
</para>
686694
</listitem>
687695
</itemizedlist>
@@ -771,7 +779,7 @@ ____________________________________________________________________________-->
771779
</para>
772780
____________________________________________________________________________-->
773781
<para>
774-
已有的被订阅表中的初始数据会被快照并且以一种特殊类型的应用进程的并行实例进行拷贝。这种进程将创建自己的临时复制槽并且拷贝现有的数据。一旦现有的数据被拷贝完,工作者会进入到同步模式,主应用进程会流式传递在使用标准逻辑复制拷贝初始数据期间发生的任意改变,这会确保表被带到一种已同步的状态。一旦同步完成,该表的复制的控制权会被交回给主应用进程,其中复制会照常继续。
782+
获取现有订阅表中初始数据的快照并且以一种特殊类型的应用进程的并行实例进行拷贝。这种进程将创建自己的复制槽并且拷贝现有的数据。复制完成后,表内容对其他后端可见。一旦现有的数据被拷贝完,worker进程会进入到同步模式,主应用进程会流式更新在使用标准逻辑复制拷贝初始数据期间发生的任意改变,这会确保表变为已同步的状态。在此同步阶段,应用和提交更改的顺序与它们在发布者发生的顺序相同。一旦同步完成,该表的复制的控制权会被交回给主应用进程,其中复制会照常继续。
775783
</para>
776784
</sect2>
777785
</sect1>
@@ -975,7 +983,7 @@ ____________________________________________________________________________-->
975983
</para>
976984
____________________________________________________________________________-->
977985
<para>
978-
订阅者还要求<varname>max_replication_slots</varname>被设置。在这种情况下,它必须至少被设置为将被加入到该订阅者的订阅数。<varname>max_logical_replication_workers</varname>必须至少被设置为订阅数加上保留给表同步的连接数。此外,可能需要调整<varname>max_worker_processes</varname>以容纳复制工作者,至少为(<varname>max_logical_replication_workers</varname> + <literal>1</literal>)。注意,一些扩展和并行查询也会从<varname>max_worker_processes</varname>中取得工作者槽。
986+
订阅者必须配置<varname>max_replication_slots</varname>。它必须设置为至少是订阅者数,加上一些用于表同步的预留。<varname>max_logical_replication_workers</varname>必须至少被设置为订阅数加上保留给表同步的连接数。此外,可能需要调整<varname>max_worker_processes</varname>以容纳复制工作者,至少为(<varname>max_logical_replication_workers</varname> + <literal>1</literal>)。注意,一些扩展和并行查询也会从<varname>max_worker_processes</varname>中取得工作者槽。
979987
</para>
980988
</sect1>
981989

0 commit comments

Comments
 (0)