mysql-遍历所有行并更新json数组中的所有对象

mysql-遍历所有行并更新json数组中的所有对象,mysql,json,loops,Mysql,Json,Loops,对于mysql 5.7,我有一个表copy\u jobs,其中一列为json类型job\u configs job\u configs有一个属性configurations,它是一个对象数组 作业配置中的数据示例: {“配置”:[ { “角色”:“介绍”、“角色id”:1、“员工id”:1, “首次付款”:“15.63”,“第二次付款”:“46.88”, “员工编号”:“00001”,“员工姓氏”:“门德斯”, “首次付款”:假,“员工姓名”:“马里奥”, “第二次付款”:错误,“总奖金百分比”

对于mysql 5.7,我有一个表
copy\u jobs
,其中一列为json类型
job\u configs

job\u configs
有一个属性
configurations
,它是一个对象数组

作业配置中的数据示例

{“配置”:[
{
“角色”:“介绍”、“角色id”:1、“员工id”:1,
“首次付款”:“15.63”,“第二次付款”:“46.88”,
“员工编号”:“00001”,“员工姓氏”:“门德斯”,
“首次付款”:假,“员工姓名”:“马里奥”,
“第二次付款”:错误,“总奖金百分比”:25
}, {
“角色”:“P&D”,“角色id”:2,“员工id”:2,
“首次付款”:“12.50”,“第二次付款”:“37.50”,
“员工编号”:“00002”,“员工姓氏”:“帕克”,
“首次付款”:假,“员工姓名”:“Shaun”,
“第二次付款”:错误,“总奖金百分比”:20
}
]}
我需要运行一个迁移,将属性
“fumbled”:false
fumblesCaught:[]
添加到此表每行的
配置
数组中的每个对象

我以为

UPDATE copy_jobs 
SET job_configs = JSON_SET(job_configs, '$.configurations[*].fumbled', false);
至少可以添加
“fumbled”:false,但会返回错误消息:
在这种情况下,路径表达式可能不包含*和**标记。

是否有一种方法可以运行一个命令,在该命令中,它将向
配置
数组中的每个对象添加两个新属性

或者我需要创建一个我可以调用的过程,该过程将通过
配置
对象获取所有行和每行循环,并逐个向对象添加两个新属性

编辑:

在@wchiquito的评论之后,我创建了一个程序,认为这会起作用

CREATE PROCEDURE updateRoleConfig()
BEGIN
DECLARE counter Int DEFAULT 0;
DECLARE totalRows Int;
SELECT COUNT(*) INTO totalRows FROM copy_jobs;
SET totalRows = totalRows + 1;

WHILE counter < totalRows DO
    SET @offset = counter;
    PREPARE getRowSql FROM 'SELECT job_configs INTO @jsonConfigs FROM copy_jobs LIMIT 1 OFFSET ?';
    EXECUTE getRowSql USING @offset;
    SELECT concat('selected row is ', @jsonConfigs);

    UPDATE copy_jobs SET job_configs = JSON_SET(job_configs, '$.configurations', CAST(
        REPLACE(
            JSON_EXTRACT(@jsonConfigs, '$.configurations'),
            '}',
            ', "fumbled": false, "fumblesCaught": []}') AS JSON
        )
    );
    SET counter = counter + 1;
END WHILE;
END

为什么会发生这种情况?

我最终通过将ID存储在变量中,然后用该ID更新和获取json来让它工作

DELIMITER //
CREATE PROCEDURE updateRoleConfig()
BEGIN
DECLARE counter Int DEFAULT 0;
DECLARE totalRows Int;
SELECT COUNT(*) FROM copy_jobs INTO totalRows;
SET totalRows = totalRows + 1;
SET counter = 0;

WHILE counter < totalRows DO
    SET @offset = counter;

    SELECT concat('offset is ', @offset);
    SELECT concat('counter is ', counter);

    PREPARE getIdSql FROM 'SELECT id FROM copy_jobs LIMIT 1 OFFSET ? INTO @rowId';
    EXECUTE getIdSql USING @offset;
    PREPARE getJsonSql FROM 'SELECT job_configs FROM copy_jobs WHERE id=? INTO @jsonConfigs';
    EXECUTE getJsonSql USING @rowId;

    SELECT concat('selected row is ', @jsonConfigs);
    SELECT concat('selected row id ', @rowId);

    SET @json = JSON_SET(@jsonConfigs, '$.configurations', CAST(
        REPLACE(
            JSON_EXTRACT(@jsonConfigs, '$.configurations'),
            '}',
            ', "fumbled": false, "fumblesCaught": []}') AS JSON
        )
    );

    UPDATE copy_jobs SET job_configs = @json WHERE id = @rowId;
    SET counter = counter + 1;
END WHILE;
END//
DELIMITER ;
分隔符//
创建过程updateRoleConfig()
开始
声明计数器Int默认值为0;
声明totalRows Int;
从复制作业到总计行中选择计数(*);
设置totalRows=totalRows+1;
设置计数器=0;
而计数器行是
设置@offset=计数器;
选择concat('offset is',@offset);
选择concat(“计数器为”,计数器);
从“从复制作业中选择id限制1偏移量”准备getIdSql?进入@rowId';
使用@offset执行getIdSql;
从“选择作业”准备getJsonSql,从复制作业配置,其中id=?进入@jsonConfigs';
使用@rowId执行getJsonSql;
选择concat('selected row is',@jsonConfigs);
选择concat('selected row id',@rowId);
SET@json=json\u SET(@jsonconfig,'$.configurations',CAST(
替换(
JSON_EXTRACT(@jsonconfig,'$.configurations'),
'}',
“,“fumbled”:false,“fumblesCaught”:[]}”)作为JSON
)
);
更新copy_jobs SET job_configs=@json,其中id=@rowId;
设置计数器=计数器+1;
结束时;
结束//
定界符;

试试一个基本的想法。@wchiquito我看了你的小提琴后更新了我的问题。仍然有问题您真的需要存储过程吗?试试。@wchiquito我实际上没有试过!很高兴您花时间向我展示了它在一个查询中是有效的。谢谢你应该把它作为答案贴出来,这样我就可以投票了!