【发布时间】:2021-01-09 13:25:27
【问题描述】:
对于 mysql 5.7,我有一个表 copy_jobs,其中有一列 json 类型为 job_configs。
job_configs 有一个属性configurations,它是一个对象数组。
job_configs中的数据示例:
{"configurations": [
{
"role": "Introduction", "role_id": 1, "employee_id": 1,
"first_payment": "15.63", "second_payment": "46.88",
"employee_number": "00001", "employee_last_name": "Mendes",
"first_payment_made": false, "employee_first_name": "Mario",
"second_payment_made": false, "total_bonus_percentage": 25
}, {
"role": "P & D", "role_id": 2, "employee_id": 2,
"first_payment": "12.50", "second_payment": "37.50",
"employee_number": "00002", "employee_last_name": "Parker",
"first_payment_made": false, "employee_first_name": "Shaun",
"second_payment_made": false, "total_bonus_percentage": 20
}
]}
我需要运行迁移,将属性"fumbled": false 和fumblesCaught: [] 添加到此表每一行的configurations 数组中的每个对象。
我以为
UPDATE copy_jobs
SET job_configs = JSON_SET(job_configs, '$.configurations[*].fumbled', false);
至少可以添加"fumbled": false,但这会返回错误消息:In this situation, path expressions may not contain the * and ** tokens.
有没有办法运行一个命令,它将两个新属性添加到configurations 数组中的每个对象?
或者我是否需要创建一个我可以调用的过程,该过程将获取所有行,并为每一行循环通过 configurations 对象,并将这两个新属性一一添加到对象中?
编辑:
在@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
但是,这会导致使用单个对象覆盖所有行 configurations 数组,从而导致所有行都相同。
奇怪的是,@jsonConfigs 的输出总是覆盖所有其他对象的值,巧合的是在表的第一行中找到的 configurations 数组的值。
{"configurations": [
{
"role": "Introduction", "role_id": 1, "employee_id": 1,
"first_payment": "15.63", "second_payment": "46.88",
"employee_number": "00001", "employee_last_name": "Mendes",
"first_payment_made": false, "employee_first_name": "Mario",
"second_payment_made": false, "total_bonus_percentage": 25}
]
}
为什么会这样?
【问题讨论】:
-
尝试一个初步的想法dbfiddle。
-
@wchiquito 看了你的小提琴后,我更新了我的问题。仍有问题