【MySQL】MySQL中的函数之JSON_ARRAY_APPEND

在 MySQL 8.0 及更高版本中,JSON_ARRAY_APPEND() 函数用于在 JSON 数组的指定位置追加一个或多个值。这个函数非常有用,特别是在你需要在 JSON 数组的末尾或特定位置添加新的元素时。

基本语法

sql 复制代码
JSON_ARRAY_APPEND(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 数组中追加一个新的爱好 "cooking":

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

查询结果:

sql 复制代码
SELECT * FROM users;

输出结果:

复制代码
+----+------------------------------------------------------------+
| id | data                                                       |
+----+------------------------------------------------------------+
| 1  | {"name": "Alice", "age": 30, "hobbies": ["reading", "traveling", "cooking"]} |
| 2  | {"name": "Bob", "age": 25, "hobbies": ["gaming", "coding"]}                             |
+----+------------------------------------------------------------+
示例 2: 向 JSON 数组中追加多个值

假设我们要向 id 为 2 的用户的 hobbies 数组中追加两个新的爱好 "painting" 和 "music":

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

查询结果:

sql 复制代码
SELECT * FROM users;

输出结果:

复制代码
+----+------------------------------------------------------------------+
| id | data                                                             |
+----+------------------------------------------------------------------+
| 1  | {"name": "Alice", "age": 30, "hobbies": ["reading", "traveling", "cooking"]} |
| 2  | {"name": "Bob", "age": 25, "hobbies": ["gaming", "coding", "painting", "music"]} |
+----+------------------------------------------------------------------+
示例 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 数组中追加一个新的任务 "task5":

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

查询结果:

sql 复制代码
SELECT * FROM users;

输出结果:

复制代码
+----+-------------------------------------------------------------------------------------------------------------------------+
| id | data                                                                                                                    |
+----+-------------------------------------------------------------------------------------------------------------------------+
| 1  | {"name": "Alice", "age": 30, "hobbies": ["reading", "traveling", "cooking"]}                                            |
| 2  | {"name": "Bob", "age": 25, "hobbies": ["gaming", "coding", "painting", "music"]}                                       |
| 3  | {"name": "Charlie", "age": 35, "projects": [{"name": "Project A", "tasks": ["task1", "task2", "task5"]}, {"name": "Project B", "tasks": ["task3", "task4"]}] } |
+----+-------------------------------------------------------------------------------------------------------------------------+

注意事项

  • JSON_ARRAY_APPEND() 只能在 JSON 数组的末尾追加值。如果路径指向的不是数组,JSON_ARRAY_APPEND() 将返回 NULL
  • 如果路径不存在,JSON_ARRAY_APPEND() 也不会修改 JSON 文档。
  • 如果需要在数组的特定位置插入值,可以使用 JSON_INSERT()JSON_SET() 函数。

组合使用

JSON_ARRAY_APPEND() 通常与其他 JSON 函数结合使用,以便更灵活地处理 JSON 数据。例如,你可以先使用 JSON_EXTRACT() 提取值,然后使用 JSON_ARRAY_APPEND() 修改值。

相关推荐
摇滚侠几秒前
mariadb-libs 被 mysql-community-libs-5.7.28-1.el7.x86_64 取代
数据库·mysql·mariadb
DIY源码阁40 分钟前
JavaSwing饮品管理系统 - MySQL版
java·数据库·mysql·eclipse
专注搞钱43 分钟前
GPT-4o写设备Recipe:从3小时到10分钟
数据库·人工智能·gpt·半导体
东风破1372 小时前
达梦数据库实战:备份恢复与数据迁移全攻略(实例初始化、服务注册、路径迁移)
数据库·chrome
SelectDB技术团队2 小时前
2026 SelectDB AI 产品发布会:Agent Native 数据基础设施能力全景发布
数据库·人工智能·agent·apache doris·selectdb
爱吃羊的老虎2 小时前
【数据库】模块一:数据库基础与关系代数
数据库
dishugj3 小时前
iSCSI + Multipath + ASM:Oracle RAC 共享存储技术链详解
数据库·oracle
yoothey3 小时前
MySQL事务机制解析 - 面试高分知识点
数据库·mysql·面试
Lkstar4 小时前
万字长文Query改写与多路召回实战|从HyDE到RRF融合,召回率提升22%的完整方案
数据库·人工智能·llm
IT新视界4 小时前
星环科技ArgoDB:基于一体化架构构建数据全生命周期安全底座
数据库·科技·安全·架构