在 MySQL 中修改 JSON 格式字段里的某个 key 值,核心是使用 MySQL 提供的 JSON 专用函数,最常用的是 JSON_SET()(覆盖 / 新增)和 JSON_REPLACE()(仅覆盖已有值)。下面我会分场景给出具体用法,确保你能直接套用。
一、核心函数说明
先明确两个关键函数的区别:
JSON_SET(json_doc, path, val):修改已有 key 的值,若 key 不存在则新增
JSON_REPLACE(json_doc, path, val):仅修改已有 key 的值,key 不存在则无操作
path 格式规则:
根节点用 $ 表示
一级 key:$.key
嵌套 key:$.parent_key.child_key
数组元素:$.array_key[0](数组下标从 0 开始)
二、演练
假设你有一张表 user_info,结构如下:
sql
CREATE TABLE user_info (
id INT PRIMARY KEY AUTO_INCREMENT,
info JSON -- 存储JSON的字段
);
-- 插入测试数据
INSERT INTO user_info (info) VALUES
('{"name":"张三","age":20,"address":{"city":"北京","area":"朝阳"}}'),
('{"name":"李四","age":25,"hobbies":["篮球","游戏"]}');
场景 1:修改一级 JSON key 的值
修改 id=1 的用户 age 为 22
sql
-- 方法1:用 JSON_SET(推荐,兼容性更强)
UPDATE user_info
SET info = JSON_SET(info, '$.age', 22)
WHERE id = 1;
-- 方法2:用 JSON_REPLACE(仅当age存在时生效)
UPDATE user_info
SET info = JSON_REPLACE(info, '$.age', 22)
WHERE id = 1;
场景 2:修改嵌套 JSON key 的值
修改 id=1 的用户 address.city 为 "上海":
sql
UPDATE user_info
SET info = JSON_SET(info, '$.address.city', '上海')
WHERE id = 1;
场景 3:修改 JSON 数组中的元素
修改 id=2 的用户 hobbies 数组第 1 个元素(下标 0)为 "足球":
sql
UPDATE user_info
SET info = JSON_SET(info, '$.hobbies[0]', '足球')
WHERE id = 2;