如何在 Postgresql 中添加、更新和删除 Json 数据类型?

Posted

技术标签:

【中文标题】如何在 Postgresql 中添加、更新和删除 Json 数据类型?【英文标题】:How To Add,Update And Delete From Json DataType On Postgresql? 【发布时间】:2022-01-17 12:53:35 【问题描述】:

这是我在 PostgreSQL 上的表格,带有联系人姓名:

    我想用这个 sql 查询编辑 mobile1 值:

update contacts->info set mobile1 = JSON_SET(mobile1, "123456") where id=5

但是说 :: ERROR: syntax error at or near "->"

    当我想用这个 sql 查询删除或添加一个值时:

delete orders->info->mobile2 where id=5

“订单”处或附近的语法错误

    或添加

update orders->info set mobile3 = JSON_SET(mobile3, "123456") where id=5

“->”处或附近的语法错误

我的语法问题是什么?以及如何在 PostgreSQL 上的 json 数据类型表上添加、更新和删除

【问题讨论】:

不相关,但使用标准化数据设计会更多更好、更容易。 【参考方案1】:

您的问题 1 的解决方案。

更新info json 字段中的mobile1 json 值:

   update contacts 
      set info = jsonb_set(info :: jsonb, 'mobile,mobile1', '123456', true) :: json
    where id=5

您的问题 2 的解决方案。

info json 字段中删除mobile2 键/值对:

   update contacts 
      set info = (info :: jsonb #- 'mobile,mobile2') :: json
    where id=5

从联系人表中删除整行:

delete from contacts where id=5

您应该仔细阅读手册Chapter 6. Data Manipulation 和9.16. JSON Functions and Operators

【讨论】:

谢谢,您对问题 1 的解决方案出现了此错误:ERROR: column "123456" does not exist 问题 2 有效@ 问题 3 如何在我的手机上添加另一个问题,例如 mobile3=987456? 是的,我确实用双引号而不是单引号复制/粘贴了您的代码。我已经更新了我的答案。【参考方案2】:

根据Postgres document 的插入、更新或删除,您应该使用JSONB 操作或函数。

Demo

    更新场景:
update contacts
set info = jsonb_set(info::jsonb, 'mobile,mobile1', '"123456"')::json
where id = 5;
    删除场景:
update contacts
set info = (info::jsonb #- 'mobile,mobile2')::json
where id = 5;
    添加场景:
update contacts
set info = jsonb_set(info::jsonb, 'mobile,mobile3', '"123456"')::json
where id = 5;

【讨论】:

感谢以上所有工作,如何在 1 个查询中添加多个手机号码,添加 mobile4、mobile5、mobile6 ? 如果需要可以使用dbfiddle.uk/…添加多个键

以上是关于如何在 Postgresql 中添加、更新和删除 Json 数据类型?的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 函数和触发器在 postgresql 中包含更改

postgresql 上的更新类型

graphql prisma node js postgresql如何将创建日期/更新字段添加到graphql类型?

在 PostgreSql 中批量更新或删除哪个更高效?

具有特定权限的 Postgresql 用户

从mac中删除了PostgreSQL用户,如何恢复?