【MySQL】MySQL中的函数之JSON_ARRAY_INSERT

在 MySQL 中,JSON_ARRAY_INSERT() 函数用于在 JSON 数组的指定位置插入一个或多个值。与 JSON_ARRAY_APPEND() 不同,JSON_ARRAY_INSERT() 可以在数组的任意位置插入值,而不仅仅是末尾。

基本语法

sql 复制代码
JSON_ARRAY_INSERT(json_doc, path, val[, path, val] ...)
  • json_doc: 要修改的 JSON 文档。
  • path: 要插入值的路径。路径必须指向一个数组。
  • val: 要插入的新值。

示例

假设有一个表 users,其中有一个字段 data 存储了用户的 JSON 数据:

sql 复制代码
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":

sql 复制代码
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.hobbies[1]', 'cooking')
WHERE id = 1;

查询结果:

sql 复制代码
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":

sql 复制代码
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.hobbies[1]', 'painting', '$.hobbies[2]', 'music')
WHERE id = 2;

查询结果:

sql 复制代码
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 数据中包含嵌套的数组:

sql 复制代码
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":

sql 复制代码
UPDATE users
SET data = JSON_ARRAY_INSERT(data, '$.projects[0].tasks[1]', 'task5')
WHERE id = 3;

查询结果:

sql 复制代码
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() 修改值。

相关推荐
qq_1249870753几秒前
基于JavaWeb的大学生房屋租赁系统(源码+论文+部署+安装)
java·数据库·人工智能·spring boot·计算机视觉·毕业设计·计算机毕业设计
倒流时光三十年32 分钟前
SpringBoot 数据库同步 Elasticsearch 性能优化
数据库·spring boot·elasticsearch
码农小卡拉1 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣501 小时前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
wjhx1 小时前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
冰暮流星2 小时前
javascript之二重循环练习
开发语言·javascript·数据库
万岳科技系统开发2 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
冉冰学姐2 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly2 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
斯普信专业组2 小时前
构建基于MCP的MySQL智能运维平台:从开源服务端到交互式AI助手
运维·mysql·开源·mcp