【问题标题】:modify the property value of JSON string stored in the Table Column修改存储在 Table Column 中的 JSON 字符串的属性值
【发布时间】: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服务器,要么获取该字符串并完全更新它。

标签: php mysql json sql-update


【解决方案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 函数,使用正则表达式替换您的值也将不起作用。 (如果你用正则表达式进行这样的操作,也会有很多问题......)

所以我看到你的唯一选择是:

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

【讨论】:

    【解决方案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函数添加属性,如果没有找到则替换它。

      希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 2015-11-06
        • 1970-01-01
        • 2021-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多