Postgres INSERT ON CONFLICT 与 JSONB

Postgres INSERT ON CONFLICT with JSONB

我正在尝试将 Postgres 用作文档存储,但当我尝试有效地更新插入 Postgres 解析器似乎不喜欢 [=29] 的文档时遇到了问题 运行 =]B运算符.

我有一个 table:

CREATE TABLE tbl (data jsonb NOT NULL);
CREATE UNIQUE INDEX ON tbl ((data->>'a'));

我尝试插入数据:

INSERT INTO tbl (data) VALUES ('{ "a": "b" }'::jsonb) 
  ON CONFLICT (data->>a) 
  DO UPDATE SET data = data || '{ "a": "b" }'::jsonb

我收到此错误消息:

ERROR:  syntax error at or near "->>"

我试过data->>a、data->>'a'、data->a,也许还有data->'a'。所有这些都是

我想将标识符列(示例中的 a)保留在 JSON 中,而不是将其作为 table 中的列。

目前支持我正在尝试做的事情吗?

您有两个问题:

1) 您需要添加额外的括号,如下所示:

ON CONFLICT ((data->>'a'))

2) 您需要在最后一个 data 引用前加上您的 table 别名,如下所示:

DO UPDATE SET data = tbl.data || '{ "a": "b" }'::jsonb

通读 this PostgreSQL documentation 这个主题。如果您正在尝试构建 json 解析器,则可能需要使用 json_populate_record 函数来填充 table。另见相关问题: How to perform update operations on columns of type JSONB in Postgres 9.4