首先我想说我没有太多经验,但是我在大学学习了一些与 dbs 相关的科目后开始学习 dbs(所以在阅读本文时请记住这一点)。
我已经在 stackoverflow 上问过这个问题,但我没有得到结论性的答案,所以我认为在这里问同样的问题可能是个好主意,因为这个网站只关注数据库及其来龙去脉。
我想使用 UPDATE、DELETE 或 INSERT 命令更改嵌套数组的单个元素。在这种情况下,我想通过使用 UPDATE 命令将一个“lastName”值换成另一个来更新数组的单个元素(我使用的语法可能是错误的,但这是我能从我的'已阅读官方文档)。在将任何内容放入真实数据库之前,我使用 dbfiddle 测试我正在做的事情是否可行,以免犯任何不必要的错误。这是我在 dbfiddle https://dbfiddle.uk/?rdbms=postgres_10&fiddle=ecc2329efea6af28636b3537d46b6c01中写的
如果有人能澄清我做错了什么,我将不胜感激。如果您对如何完成此类事情有任何建议,我将非常乐意获得一些建设性的反馈。
我认为这不能使用
jsonb_set()
.该函数的第二个参数需要一个“目标路径”。由于
podaci
包含一个数组,您需要包含数组位置,例如jsonb_set(podaci, '{1,lastName}', '"Kirin"')
- 但是,没有简单的方法(我能想到)来获得您需要的索引位置。因此,您将需要遍历元素,更改您想要的元素并聚合回来。这可以通过 UPDATE 语句分配中的子查询来完成:
jsonb_agg()
将返回的元素聚合jsonb_array_elements()
到一个数组中。然后 CASE 表达式将检查每个元素,如果它包含名字 Maria,姓氏将被替换(将 JSONB 值附加到 JSONB 值,替换现有键)WHERE 子句防止更新不需要更新的行
在线示例
但是,您的模型看起来确实像是在数据库中误用了 JSON。将名称存储在与基表具有一对多关系的适当关系表中会更有效(
test_tablica1
在您的示例中)就像是:
然后更新变得如此简单:
条件
tablica1_id = 1
只是一个例子。添加所需的任何条件,以将名称更改限制为链接到父表中特定行的行。