Изменить значение свойства строки JSON, хранящейся в столбце таблицы

У меня есть строка JSON, хранящаяся в столбце базы данных. Я должен обновить это значение в строке JSON.

Вот моя таблица. my-table-image

Я хочу обновить значение state внутри него.

Пример:

Name1 имеет значение состояния KA, поэтому я хочу обновить его до GJ.

Что я пробовал до сих пор?

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

Также пробовал JSON_REPLACE также не работает.

Но это показывает ошибку:

ФУНКЦИЯ Customer.JSON_MODIFY делает не существует

Примечание. Я знаю одно обходное решение для этого, но я не хотел получить эту строку и полностью ее обновить. Я хочу обновить детали в строке.

Я также создал SQL Fiddle.

Я делаю это на localhost. Ниже приведены сведения о локальном хосте.

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.

...

Try:

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

См. db-fiddle.

Ответ 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, чтобы добавить свойство, если оно не найдено, а затем замените его.

Надеюсь, это поможет!