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


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

Вот мой стол. my-table-image

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

Пример:

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

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

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

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

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

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

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

Я также создал скрипку SQL.

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

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
Author: always-a-learner, 2017-08-06

4 answers

12.16 Функции JSON

...

Если не указано иное, функции JSON были добавлены в MySQL 5.7.8.

...

Попробуйте:

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

См. db-скрипка.

 5
Author: wchiquito, 2017-08-06 13:48:03

Как уже указывал @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, если это возможно.

 6
Author: Mario, 2017-09-05 09:06:15

Поскольку у вас есть старый 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
 1
Author: delboy1978uk, 2017-08-31 11:52:17

Вы можете:

Используйте функцию JSON_INSERT, чтобы добавить свойство к объекту, если оно не существует

Использовать JSON_REPLACE функция заменяет свойство, только если оно существует

Используйте функцию JSON_SET, чтобы добавить свойство, если оно не найдено, а затем заменить его.

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

 1
Author: Abhay Dixit, 2017-09-06 09:37:45