使用JSON_SET,我可以轻松更新简单的JSON数据类型,但是嵌套使用则无效。
这种格式的查询应该是什么样的:
{
"textures":[
{
"label":"test",
"types":{
"t_1":0,
"t_2":0
}
},
{
"label":"KEK",
"types":{
"t_1":0,
"t_2":0
}
}
],
"weapons":[
{
"name":"WW_SHT",
"ammo":0
},
{
"name":"WW_DSS",
"ammo":0
}
]
}
有些行可能是空的,有些行将没有“武器”结构。
我尝试过的事情:
UPDATE `player` SET `info` = COALESCE(
JSON_MERGE(
`info`,
JSON_OBJECT('textures',
JSON_OBJECT('types',
JSON_OBJECT('t_1', '1', 't_2', '0')
)
)
),
JSON_INSERT(
JSON_OBJECT(),
'$.textures',
JSON_OBJECT('types',
JSON_OBJECT('t_1', '1', 't_2', '0')
)
)
);
我想更新t_1以将值从0更改为1
答案 0 :(得分:0)
您真的很困惑您的代码。尝试使用json_set或json_replace以及
之类的更新... WHERE doc->"$.textures[*].types.t_1" = 0
您的代码很难阅读和理解,因为其中嵌入了许多功能
MySQL 8中不推荐使用BTW json_merge
您将要阅读https://elephantdolphin.blogspot.com/2018/09/json-paths-and-mysql-json-functions.html
答案 1 :(得分:0)
UPDATE player SET info = JSON_REPLACE(info, '$.textures[0].t_1', '1');
但是,这只会替换第0个纹理中的值。如果您有多个纹理,则可以找出多少个纹理:
SELECT JSON_LENGTH(info, '$.textures') AS textures_count FROM player;
P.S .:这可能是一个应用程序,如果使用传统的 标准化数据库。实际上,我还没有见过MySQL中的JSON例子,如果以传统方式设计表的话,这将不那么容易。