修改存储在表列中的 JSON 字符串的属性值

2022-08-30 23:36:23

我的数据库列中存储了 JSON 字符串。我必须在JSON字符串中更新该值。

这是我的桌子。my-table-image

我想更新其中的值。state

例:

Name1 具有状态值,因此我想将其更新为 。KAGJ

到目前为止,我尝试了什么?

UPDATE Customer
SET Detail = JSON_MODIFY(Detail , '$.Address.State', 'KA')
WHERE Name = 'name1';

还尝试也不起作用。JSON_REPLACE

但它显示了错误:

函数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

答案 1

12.16 JSON 函数

...

除非另有说明,否则 JSON 函数已添加到 MySQL 5.7.8 中。

...

尝试:

UPDATE `Customer`
SET `Detail` = JSON_REPLACE(`Detail`, '$.Address.State', 'GJ')
WHERE `Name` = 'name1';

请参阅 db-fiddle


答案 2

正如@wchiquito已经指出的那样,JSON函数是在MySQL 5.7.8中添加的

如果您无法升级MySQL安装,则必须采取您提到的解决方法。如果不能够定义自定义mysql函数,使用正则表达式替换您的值也是行不通的。(另外,如果您使用正则表达式执行此类操作,则可能会出错很多问题...)

因此,我看到您拥有的唯一选择是:

  1. 升级您的安装(授予@wchiquito)。

  2. 获取列,解析并更新它。就像你提到自己是一种解决方法。

这可能看起来像这样:

// 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安装。


推荐