it-swarm.com.ru

изменить значение свойства строки 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 тоже не работает.

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

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
15
always-a-learner

12.16 Функции JSON

...

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

...

Пытаться:

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

Смотрите db-fiddle .

5
wchiquito

Как уже указывалось @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
Mario

Поскольку у вас есть старый 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
delboy1978uk

Вы можете:

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

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

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

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

1
Abhay Dixit