首页/数据/SQL 速查/JSON_MERGE_PATCH / MERGE_PRESERVE 与 || 合并
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

JSON_MERGE_PATCH / MERGE_PRESERVE 与 || 合并

合并两个 JSON 文档:MySQL 提供 patch(RFC 7396 风格)与 preserve 两种;PostgreSQL 用 || 做“右值覆盖”式浅合并。

SQL 速查数据更新于 2026-10-12

MySQL

MySQL
-- PATCH 语义:null 删除键、对象递归合并、非对象直接替换
SELECT JSON_MERGE_PATCH('{"a":1,"b":2}', '{"a":null,"c":3}');
-- {"b": 2, "c": 3}

-- PRESERVE 语义:数组连接、重复键都保留
SELECT JSON_MERGE_PRESERVE('{"a":[1,2]}', '{"a":[3]}');
-- {"a": [1, 2, 3]}

PostgreSQL

PostgreSQL
-- || 合并:对象取并集、右侧覆盖同名键(浅层)
SELECT '{"a":1,"b":2}'::jsonb || '{"a":9,"c":3}'::jsonb;
-- {"a": 9, "b": 2, "c": 3}
JSON_MERGE_PATCHRFC 7396:null 删键、递归合并;旧函数 JSON_MERGE 已废弃(8.0.3 起)
JSON_MERGE_PRESERVE数组拼接、保留重复键(旧版 JSON_MERGE 的等价物)
PostgreSQL ||顶层浅合并,不是递归 patch 语义

易错点

  • 把 JSON_MERGE_PATCH 当“深度更新”用:嵌套对象确实递归,但显式 null 会删除整个键,先确认配置语义
  • 继续使用已废弃的 JSON_MERGE 会收到 deprecation 警告,按语义替换成 PATCH 或 PRESERVE

数据来源与参考

  • MySQL 8.0 Reference Manual · JSON Functions
  • PostgreSQL Documentation · JSON Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌