4

在 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字段,但我想知道 Postgres 支持json类型,它应该支持部分修改,否则json类型和text类型之间没有区别。(我知道jsontype 也有与不同的类型验证text

4

2 回答 2

7

目前不支持 JSON 索引和部分更新。PostgreSQL 9.2 中的 JSON 支持是初级的,仅限于验证 JSON 并将行和数组转换为 JSON。在内部,json确实差不多text

正在进行部分更新、索引等增强功能的工作。无论如何,当 JSON 值的一部分发生更改时,PostgreSQL 将无法避免重写整行,因为这是 MVCC 并发模型所固有的。使这成为可能的唯一方法是将 JSON 值拆分为边关系中的多个元组,例如 TOAST 表 - 这是可能的,但可能表现不佳,而且目前还远远没有考虑到这一点。

正如 Chris Travers 所指出的,您可以使用 PL/V8 函数或其他支持 json 的语言(如 Perl 或 Python)来提取值,然后在这些函数上创建表达式索引。

于 2013-01-08T02:56:28.757 回答
2

从 PostgreSQL 9.5 开始,有一个函数被jsonb_set称为输入参数:

  • 一个 JSON 对象
  • 指示路径的数组(键和子键)
  • 要存储的新值(也是 JSON 对象)

例子:

 # 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)
于 2019-10-21T14:53:03.243 回答