修改存储在 Table Column 中的 JSON 字符串的属性值
Posted
技术标签:
【中文标题】修改存储在 Table Column 中的 JSON 字符串的属性值【英文标题】:modify the property value of JSON string stored in the Table Column 【发布时间】:2018-01-13 21:47:21 【问题描述】:我的数据库列中存储了 JSON 字符串。我必须在 JSON 字符串中更新该值。
这是我的桌子。
我想更新其中的state
值。
示例:
Name1 的状态值为
KA
,所以我想将其更新为GJ
。
到目前为止我尝试了什么?
UPDATE Customer
SET Detail = JSON_MODIFY(Detail , '$.Address.State', 'KA')
WHERE Name = 'name1';
也试过 JSON_REPLACE
也不起作用。
但它显示错误:
FUNCTION Customer.JSON_MODIFY 不存在不存在
注意:我知道一种解决方法可以做到这一点,但我不想获取该字符串并完全更新它。我想更新字符串中的特定细节。
我还创建了SQL Fiddle.
我在本地主机上执行此操作。以下是本地主机详细信息。
Database server
Server: localhost (localhost via TCP/IP)
Software: mysql
MySQL Version :5.5.24
phpMyAdmin
Version information: 3.5.1, latest stable version: 4.7.3
【问题讨论】:
你用的是什么版本的 MySQL? 我将编辑这个有问题的细节@wchiquito 正如 wchiquito 已经告诉你的那样:json 是在 5.7 中添加的。您使用的是 5.5。所以所有这些 json 函数都不起作用,因为它们还不存在。而且我认为也没有可以进行此更新的json udf(但也许您很幸运)。所以要么升级你的mysql服务器,要么获取该字符串并完全更新它。 【参考方案1】:12.16 JSON Functions
...
除非另有说明,否则 JSON 函数已添加到 MySQL 中 5.7.8.
...
试试:
UPDATE `Customer`
SET `Detail` = JSON_REPLACE(`Detail`, '$.Address.State', 'GJ')
WHERE `Name` = 'name1';
见db-fiddle。
【讨论】:
它将在 locahost 的 mySql 中显示FUNCTION JSON_REPLACE does not exist
你的小提琴正在工作,但它在我的本地主机中显示错误。
@always-a-learner: JSON_REPLACE
函数自 MySQL 5.7.8 版起可用。
恕我直言,先生,我的 sql 显示上述错误。我尝试了其他 json 函数,但仍然出现相同的错误。 @Wchiquito
@always-a-learner:我了解到您的 MySQL 版本是 5.5.24,在该版本中 JSON 函数不可用。【参考方案2】:
正如@wchiquito 已经指出的,JSON 函数是在 MySQL 5.7.8 中添加的。
如果您无法升级您的 MySQL 安装,您将不得不采用您提到的解决方法。如果不能定义自定义 mysql 函数,使用正则表达式替换您的值也将不起作用。 (如果你用正则表达式进行这样的操作,也会有很多问题......)
所以我看到你的唯一选择是:
升级您的安装(授予@wchiquito)。
获取列,解析并更新它。正如您提到自己作为一种解决方法一样。
可能看起来像这样:
// fetch the details
$sth = $pdo->prepare('select `Detail` from `Customer` where `Name` = ?');
$sth->execute(['name1']);
$detail = json_decode($sth->fetchColumn(), true);
// modify the state
$detail['Address']['State'] = 'KA';
// update the details
$sth = $pdo->prepare('update `Customer` set `Detail` = ? where `Name` = ?');
$sth->execute([json_encode($detail), 'name1']);
但我建议尽可能升级您的 MySQL 安装。
【讨论】:
【参考方案3】:因为你有一个旧的 MySQL,所以获取 JSON 字符串,将它解码为一个数组,编辑数组,重新编码,然后更新你的行:
// Fetch row
$json = $row['columnName'];
$array = json_decode($json, true); //true creates array and not stdClass
$array['valueToChange'] = 'some new value';
$json = json_encode($array);
// Perform update query
【讨论】:
【参考方案4】:你可以:
如果对象不存在,使用JSON_INSERT函数将属性添加到对象
仅当属性存在时才使用 JSON_REPLACE 函数替换属性
使用JSON_SET函数添加属性,如果没有找到则替换它。
希望这会有所帮助!
【讨论】:
以上是关于修改存储在 Table Column 中的 JSON 字符串的属性值的主要内容,如果未能解决你的问题,请参考以下文章
java.sql.SQLException: ORA-01747: user.table.column, table.column 或列说明