修改存储在 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 字符串的属性值的主要内容,如果未能解决你的问题,请参考以下文章

如何执行存储在表(查询)中的查询(更新)?

04MySql表的操纵

java.sql.SQLException: ORA-01747: user.table.column, table.column 或列说明

ALTER TABLE - 修改表的定义

用斜线分隔 Sql Table 列并将值存储在新列中

Oracle中的cluster是啥意思,它有啥作用?