通过查看Postgres 9.4数据类型JSONB的文档,我并不清楚如何对JSONB列进行更新.

JSONB类型和功能的文档:

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

举个例子,我有一个基本的表格 struct :

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;

这是我错过的明显的地方吗?谢谢

推荐答案

理想情况下,对于要在关系数据库中操作的 struct 化、常规数据,不要使用JSON文档.用normalized relational design代替.

JSON主要用于存储不需要在RDBMS中操作的完整文档.相关的:

在Postgres中更新一行总是写入whole行的新版本.这是Postgres' MVCC model的基本原则.从性能Angular 来看,更改JSON对象中的一条数据还是全部数据几乎无关紧要:必须编写一个新版本的行.

因此,advice in the manual人:

JSON数据的并发控制考虑因素与

要点是:要在JSON对象中修改anything,必须为列指定一个修改过的对象.Postgres除了存储能力之外,还提供有限的方法来构建和操作json个数据.自9.2版以来,随着每一个新版本的发布,工具库都有了实质性的增长.但原则仍然是:必须为列分配一个完整的修改对象,Postgres总是为任何更新写入一个新的行版本.

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

这个答案和我在SO together上的其他答案一样吸引了很多反对票.人们似乎不喜欢这个 idea :对于常规数据来说,规范化设计更优越.克雷格·林格(Craig Ringer)的这篇优秀博文更详细地解释了:

Laurenz Albe的另一篇博文,另外official Postgres contributor篇,比如Craig和我自己:

Postgresql相关问答推荐

使用PGx在围棋中执行多条SQL语句

使函数内部动态插入更具可读性

如何诊断字符编码问题

如何在PostgreSQL中 Select 最近30天内的开始日期?

将整数(以毫秒为单位的epoch时间)转换为PrimitiveDateTime

如何使用 PostgreSQL 数据库中的函数和存储过程从动态表中获取所有数据?参数传入的表名

postgresql查询中的正则表达式不区分大小写

处理 sqlalchemy 断开连接的更好方法

断言错误:Django-rest-Framework

在函数中返回字段作为插入结果

如何将1 天 01:30:00等间隔转换为25:30:00?

IntegrityError:postgres 从转储恢复后,所有具有 ForeignKey 的模型/字段的id列中的空值

Select 中的 PostgreSQL 正则表达式捕获组

如何启动 Postgres 服务器?

psql 致命角色不存在

如何为 postgres 编写 DELETE CASCADE?

PostgreSQL 9 在 Windows 上安装:Unable to write inside TEMP environment path.

PostgreSQL 无法启动:server.key具有组或世界访问权限

PostgreSQL 多种认证方式

如何为 Postgresql 中的所有数据库创建具有只读权限的用户?