在Postgres
我有一个这样的数据库:
CREATE TABLE storehouse
(
user_id bigint NOT NULL,
capacity integer NOT NULL,
storehouse json NOT NULL,
last_modified timestamp without time zone NOT NULL,
CONSTRAINT storehouse_pkey PRIMARY KEY (user_id)
)
storehouse.storehouse
正在存储如下数据:
{
"slots":[
{
"slot" : 1,
"id" : 938
},
{
"slot" : 2,
"id" : 127
},
]
}
问题是,我想更新storehouse.storehouse.slots[2]
,但我不知道如何做到这一点,我知道如何改变整个storehouse.storehouse
字段,但我想知道自{{ {1}}支持postgres
类型,它应该支持部分修改,否则json
类型和json
类型之间没有区别。(我知道text
类型也有类型验证与json
)
答案 0 :(得分:7)
目前不支持JSON索引和部分更新。 PostgreSQL 9.2中的JSON支持是基本的,仅限于验证JSON以及将行和数组转换为JSON。在内部,json
确实只是text
。
正在进行部分更新,索引等增强功能。无论如何,当JSON值的一部分发生变化时,PostgreSQL将无法避免重写整行,因为这是MVCC模型固有的。并发性。实现这一目标的唯一方法是将JSON值拆分为多边元组中的多个元组,如TOAST表 - 这是可能的,但可能性能很差,而且目前还远未被考虑。
正如Chris Travers指出的那样,可以使用其他语言的PL / V8函数或函数,使用像Perl或Python这样的json支持来提取值,然后在这些函数上创建表达式索引。
答案 1 :(得分:0)
自PostgreSQL 9.5起,有一个名为jsonb_set
的函数将其作为输入参数:
示例:
# SELECT jsonb_set('{"name": "James", "contact": {"phone": "01234 567890", "fax": "01987 543210"}}'::jsonb,
'{contact,phone}',
'"07900 112233"'::jsonb);
jsonb_replace
--------------------------------------------------------------------------------
{"name": "James", "contact": {"fax": "01987 543210", "phone": "07900 112233"}}
(1 row)