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
我正在尝试将 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