Ответ 1
...
Если не указано иное, функции JSON были добавлены в MySQL 5.7.8.
...
Try:
UPDATE `Customer`
SET `Detail` = JSON_REPLACE(`Detail`, '$.Address.State', 'GJ')
WHERE `Name` = 'name1';
См. db-fiddle.
У меня есть строка JSON, хранящаяся в столбце базы данных. Я должен обновить это значение в строке JSON.
Я хочу обновить значение 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
...
Если не указано иное, функции JSON были добавлены в MySQL 5.7.8.
...
Try:
UPDATE `Customer`
SET `Detail` = JSON_REPLACE(`Detail`, '$.Address.State', 'GJ')
WHERE `Name` = 'name1';
См. db-fiddle.
Как уже указывал @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, если это возможно.
Поскольку у вас есть старый 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
Вы можете:
Используйте функцию JSON_INSERT, чтобы добавить свойство к объекту, если оно не существует
Функция JSON_REPLACE заменяет свойство только в том случае, если оно существует
Используйте функцию JSON_SET, чтобы добавить свойство, если оно не найдено, а затем замените его.
Надеюсь, это поможет!