当前位置: 首页 > 知识库问答 >
问题:

Postgres插入与JSONB的冲突

牟稳
2023-03-14

我试图将Postgres用作文档存储,但在Postgres解析器似乎不喜欢JSONB操作符的情况下,当我试图有效地向上插入文档时,遇到了一个问题。

我有一张桌子:

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 "->>"

我试过数据-

我想将标识符列(示例中的a)留在JSON中,而不是使其成为表上的列。

我正在尝试做的事情目前是否得到支持?

共有2个答案

蓬威
2023-03-14

通读关于这个主题的PostgreSQL文档。如果试图构建json解析器,可能需要使用json_populate_record函数来填充表格。另请参见相关问题:如何在Postgres 9.4中对JSONB类型的列执行更新操作

慎星纬
2023-03-14

你有两个问题:

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

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

2) 您需要在最后一个数据引用前面加上表别名,如下所示:

DO UPDATE SET data = tbl.data || '{ "a": "b" }'::jsonb
 类似资料:
  • 我有一张像下面这样的桌子。我试图根据CTE中的值合并到此表中。但当我试图在出现冲突时更新表时,它无法获得CTE中的值 现在使用cte,我想在这个表中插入/更新记录。下面是我用来做同样的事情的代码。当记录已经存在于表中时,我想根据cte(cte_input_data.data_type_id)中的data_type_id值更新表,但它失败并出错。 它应该实现的是 > 如果cte_输入_数据。数据类型

  • Postgres 10和11的插入说明: 关于冲突[冲突目标]冲突行动 我有一张桌子: 而我想做的 但是我得到一个错误: ON CONFLICT DO UPDATE需要推理规范或约束名称提示:例如,ON CONFLICT(column_name) 为什么我必须提供一个确定的目标?如何提供主键或其他列集?

  • 我有一个表,它有,,和 在常规插入时自动递增。 的值介于1到10之间,因为有10个问题,但对表来说不是唯一的,并且依赖于列。 用于引用单独表中的报表。 我要实现的是,如果对于特定的没有冲突的,则插入新的记录。如果有冲突,则用新的

  • 我有下面的Postgres查询,当通过psql客户端运行时可以很好地工作- 然而,当我通过创建org.hibernate.query对象来运行查询时,我得到了一个类似于这样的异常- psqlexception:错误:运算符不存在:jsonb@>字符变化提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。职位:144 请帮帮忙。我读了以下关于创建一个新类型的帖子,并且Hibern

  • 我正在阅读Postgres Jsonb文档,但找不到解决我遇到的一个小问题的方法。 我有一张桌子:MY_TABLE 具有以下列: 用户、名称、数据和购买 需要注意的是,“数据”是一个jsonb,有多个字段。“Data”中的一个字段是“Attribute”,但它可以保存的值不同步。我的意思是,它可以是一个字符串,一个字符串列表,一个空列表,或者只是一个空字符串。然而,我想改变这一点。 我希望允许的唯

  • 问题内容: 我有一个脚本,它通过自定义ORM生成数以万计的插入Postgres数据库中。可以想象,它非常慢。这用于开发目的,以便创建伪数据。我可以在Postgres级别上进行简单的优化以使其更快吗?它是唯一按顺序运行的脚本,不需要线程安全。 也许我可以关闭所有锁定,安全检查,触发器等?只是寻找一种快速而肮脏的解决方案,可以大大加快这一过程。 谢谢。 问题答案: 如果您在生产环境中不需要这种功能,建