小编典典

如何在 Postgres 9.4 中对 JSONB 类型的列执行更新操作

all

查看 Postgres 9.4 数据类型 JSONB 的文档,对我来说如何对 JSONB 列进行更新并不是很明显。

JSONB 类型和函数的文档:

http://www.postgresql.org/docs/9.4/static/functions-json.html

http://www.postgresql.org/docs/9.4/static/datatype-
json.html

例如,我有这个基本的表结构:

CREATE TABLE test(id serial, data jsonb);

插入很容易,如下所示:

INSERT INTO test(data) values ('{"name": "my-name", "tags": ["tag1", "tag2"]}');

现在,我将如何更新“数据”列?这是无效的语法:

UPDATE test SET data->'name' = 'my-other-name' WHERE id = 1;

这是否记录在我错过的明显地方?谢谢。


阅读 141

收藏
2022-06-21

共1个答案

小编典典

理想情况下,不要将 JSON 文档用于要在关系数据库中操作的结构化常规数据。请改用 规范化关系设计

JSON 主要用于存储不需要在 RDBMS 中操作的整个文档。有关的:

在 Postgres 中更新一行总是写入 行的新版本。这就是Postgres 的 MVCC
模型
的基本原理。从性能的角度来看,您是更改 JSON 对象中的单个数据还是更改所有数据都无关紧要:必须编写行的新版本。

因此手册中的建议

当存储在表中时,JSON 数据与任何其他数据类型一样受到相同的并发控制注意事项。尽管存储大文档是可行的,但请记住,任何更新都会获取整行的行级锁。考虑将
JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。理想情况下,每个 JSON
文档都应该代表一个原子数据,业务规则规定不能合理地进一步细分为可以独立修改的较小数据。

它的要点:要修改JSON 对象中的 任何内容 ,您必须将修改后的对象分配给列。json除了存储能力之外,Postgres
还提供了有限的方法来构建和操作数据。自 9.2 版以来,随着每个新版本的发布,工具库都大幅增加。但是原则仍然存在:您 总是
必须将一个完整的修改对象分配给列,并且 Postgres 总是为任何更新写入一个新的行版本。

如何使用 Postgres 9.3 或更高版本的工具的一些技巧:

2022-06-21