如何在一行中更新多个json对象?

时间:2017-11-10 08:52:37

标签: mysql json

您好我在MySQL中使用JSON。我遇到了麻烦...

例如,我有以下数据

{
     1:{fan:0},
     2:{fan:3},
     3:{fan:4},
}

我希望将每个粉丝值更新为6:如何在MySQL语句中执行此操作?

我的下面的陈述给出“在这种情况下路径表达式可能不包含*和**标记”

UPDATE mytable set json = JSON_REPLACE(json,'$.*."Fan"', 6);

有没有简单的方法来实现这个目标?

1 个答案:

答案 0 :(得分:1)

一种选择是使用存储的例程(Function)。根据需要修改脚本:

DROP FUNCTION IF EXISTS `update_json`;

DELIMITER //

CREATE FUNCTION `update_json` (
  `json` JSON,
  `key` CHAR(5),
  `value` TINYINT
) RETURNS JSON
BEGIN
  DECLARE `_keys` JSON DEFAULT JSON_KEYS(`json`);
  DECLARE `_length_keys` TINYINT UNSIGNED DEFAULT JSON_LENGTH(`_keys`);
  DECLARE `_current_key` TINYINT UNSIGNED DEFAULT 0;
  DECLARE `_key` VARCHAR(10);
  WHILE `_current_key` < `_length_keys` DO
    SET `_key` := JSON_EXTRACT(`_keys`, CONCAT('$[', `_current_key`, ']')),
        `json` := JSON_REPLACE(`json`, CONCAT('$.', `_key`,'.', `key`), `value`),
        `_current_key` := `_current_key` + 1;
  END WHILE;
  RETURN `json`;
END//

DELIMITER ;

UPDATE `mytable`
SET `json` = `update_json`(`json`, '"fan"', 6);

请参阅db-fiddle