在 MySQL 中,JSON_ARRAY_INSERT()
函数用于在 JSON 数组的指定位置插入一个或多个值。与 JSON_ARRAY_APPEND()
不同,JSON_ARRAY_INSERT()
可以在数组的任意位置插入值,而不仅仅是末尾。
基本语法
JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
json_doc
: 要修改的 JSON 文档。path
: 要插入值的路径。路径必须指向一个数组。val
: 要插入的新值。
示例
假设有一个表 users
,其中有一个字段 data
存储了用户的 JSON 数据:
CREATE TABLE users (
id INT PRIMARY KEY,
data JSON
);
INSERT INTO users (id, data) VALUES
(1, '{"name": "Alice", "age": 30, "hobbies": ["reading", "traveling"]}'),
(2, '{"name": "Bob", "age": 25, "hobbies": ["gaming", "coding"]}');
示例 1: 在 JSON 数组的指定位置插入一个值
假设我们要在 id
为 1 的用户的 hobbies
数组的第二个位置(索引 1)插入一个新的爱好 “cooking”:
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.hobbies[1]', 'cooking')
WHERE id = 1;
查询结果:
SELECT * FROM users;
输出结果:
+----+------------------------------------------------------------+
| id | data |
+----+------------------------------------------------------------+
| 1 | {"name": "Alice", "age": 30, "hobbies": ["reading", "cooking", "traveling"]} |
| 2 | {"name": "Bob", "age": 25, "hobbies": ["gaming", "coding"]} |
+----+------------------------------------------------------------+
示例 2: 在 JSON 数组的多个位置插入多个值
假设我们要在 id
为 2 的用户的 hobbies
数组的第二个位置(索引 1)插入 “painting”,在第三个位置(索引 2)插入 “music”:
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.hobbies[1]', 'painting', '$.hobbies[2]', 'music')
WHERE id = 2;
查询结果:
SELECT * FROM users;
输出结果:
+----+------------------------------------------------------------------+
| id | data |
+----+------------------------------------------------------------------+
| 1 | {"name": "Alice", "age": 30, "hobbies": ["reading", "cooking", "traveling"]} |
| 2 | {"name": "Bob", "age": 25, "hobbies": ["gaming", "painting", "music", "coding"]} |
+----+------------------------------------------------------------------+
示例 3: 在嵌套的 JSON 数组中插入值
假设 JSON 数据中包含嵌套的数组:
INSERT INTO users (id, data) VALUES
(3, '{"name": "Charlie", "age": 35, "projects": [{"name": "Project A", "tasks": ["task1", "task2"]}, {"name": "Project B", "tasks": ["task3", "task4"]}] }');
我们可以向 id
为 3 的用户的 projects
数组中的第一个项目的 tasks
数组的第二个位置(索引 1)插入一个新的任务 “task5”:
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.projects[0].tasks[1]', 'task5')
WHERE id = 3;
查询结果:
SELECT * FROM users;
输出结果:
+----+-------------------------------------------------------------------------------------------------------------------------+
| id | data |
+----+-------------------------------------------------------------------------------------------------------------------------+
| 1 | {"name": "Alice", "age": 30, "hobbies": ["reading", "cooking", "traveling"]} |
| 2 | {"name": "Bob", "age": 25, "hobbies": ["gaming", "painting", "music", "coding"]} |
| 3 | {"name": "Charlie", "age": 35, "projects": [{"name": "Project A", "tasks": ["task1", "task5", "task2"]}, {"name": "Project B", "tasks": ["task3", "task4"]}] } |
+----+-------------------------------------------------------------------------------------------------------------------------+
注意事项
JSON_ARRAY_INSERT()
可以在数组的任意位置插入值,而不仅仅是末尾。- 如果路径指向的不是数组,
JSON_ARRAY_INSERT()
将返回NULL
。 - 如果路径不存在,
JSON_ARRAY_INSERT()
会创建一个新的路径并插入值。 - 插入值时,路径中的索引是从 0 开始的。
组合使用
JSON_ARRAY_INSERT()
通常与其他 JSON 函数结合使用,以便更灵活地处理 JSON 数据。例如,你可以先使用 JSON_EXTRACT()
提取值,然后使用 JSON_ARRAY_INSERT()
修改值。