查看 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;
这是否记录在我错过的明显地方?谢谢。
理想情况下,不要将 JSON 文档用于要在关系数据库中操作的结构化常规数据。请改用 规范化关系设计 。
JSON 主要用于存储不需要在 RDBMS 中操作的整个文档。有关的:
在 Postgres 中更新一行总是写入 整 行的新版本。这就是Postgres 的 MVCC 模型的基本原理。从性能的角度来看,您是更改 JSON 对象中的单个数据还是更改所有数据都无关紧要:必须编写行的新版本。
因此手册中的建议:
当存储在表中时,JSON 数据与任何其他数据类型一样受到相同的并发控制注意事项。尽管存储大文档是可行的,但请记住,任何更新都会获取整行的行级锁。考虑将 JSON 文档限制在可管理的大小,以减少更新事务之间的锁争用。理想情况下,每个 JSON 文档都应该代表一个原子数据,业务规则规定不能合理地进一步细分为可以独立修改的较小数据。
它的要点:要修改JSON 对象中的 任何内容 ,您必须将修改后的对象分配给列。json除了存储能力之外,Postgres 还提供了有限的方法来构建和操作数据。自 9.2 版以来,随着每个新版本的发布,工具库都大幅增加。但是原则仍然存在:您 总是 必须将一个完整的修改对象分配给列,并且 Postgres 总是为任何更新写入一个新的行版本。
json
如何使用 Postgres 9.3 或更高版本的工具的一些技巧: