首页 > 解决方案 > 如何按 id 删除 mySQL JSON 列元素,而不是按索引 num

问题描述

提供数据源:

https://raw.githubusercontent.com/usnistgov/oscal-content/master/examples/ssp/json/ssp-example.json

我已将此添加到名为json_data的表中的 JSON 列中ssp_models,记录 uuid 为66c2a1c8-5830-48bd-8fdd-55a1c3a52888

记录在 myPHPAdmin 中的外观截图

我能够从具有该数据集的“各方”节点中很好地获取记录、插入记录和删除记​​录。

然而,这JSON_REMOVE部分并没有像我想要的那样工作。目前我可以通过 indexnum json_remove 一个条目:

UPDATE ssp_models 
   SET json_data = JSON_REMOVE(json_data, '$.\"system-security-plan\".metadata.parties[0]') 

这样就可以像您期望的那样从“各方”中删除条目 [0]。

但我真正想要的是能够通过 uuid 删除记录。正如您在数据的“各方”部分中看到的,uuid 是每个条目中的一个元素:

parties: [

{

uuid: "3b2a5599-cc37-403f-ae36-5708fa804b27",

type: "organization",

name: "Enterprise Asset Owners"

},

{

uuid: "833ac398-5c9a-4e6b-acba-2a9c11399da0",

type: "organization",

name: "Enterprise Asset Administrators"

}....

那么,当它是 JSON 文档存储语法的一部分时,如何以某种方式将 'WHERE uuid = "3b2a5599-cc37-403f-ae36-5708fa804b27"' 组合到这样的 sql 查询中呢?(在这种情况下,我希望它会删除“企业资产所有者”条目以及它的类型和 uuid。就像我们需要添加搜索功能作为删除的一部分,但我一直在阅读的示例不要在 json_remove 中提供该选项: https ://database.guide/json_remove-remove-data-from-a-json-document-in-mysql/

标签: mysqlsqljsonsql-update

解决方案


JSON_SEARCH()函数可用于查找具有uuid要删除的值的元素的索引,例如

UPDATE ssp_models 
   SET json_data = JSON_REMOVE(json_data, 
                       REPLACE(
                        JSON_UNQUOTE(
                            JSON_SEARCH(json_data, 
                                        'one', 
                                        '3b2a5599-cc37-403f-ae36-5708fa804b27')
                            ),'.uuid',
                       ''))

Demo


推荐阅读