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

JSON_SET / JSON_INSERT / JSON_REPLACE 与 jsonb_set

修改 JSON 文档内字段:MySQL 三兄弟分工是“插或改 / 只插 / 只改”;PostgreSQL 用 jsonb_set 与删除运算符。

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

MySQL

MySQL
SELECT JSON_SET(doc, '$.status', 'paid');      -- 有则改、无则插
SELECT JSON_INSERT(doc, '$.vip', true);        -- 仅在不存在时插入
SELECT JSON_REPLACE(doc, '$.status', 'paid');  -- 仅在存在时修改
SELECT JSON_REMOVE(doc, '$.temp');             -- 删除键

UPDATE orders SET doc = JSON_SET(doc, '$.status', 'paid') WHERE id = 1;

PostgreSQL

PostgreSQL
UPDATE orders
SET doc = jsonb_set(doc, '{status}', '"paid"'::jsonb)
WHERE id = 1;

-- create_missing=false:路径不存在时原样返回(不报错)
SELECT jsonb_set(doc, '{vip}', 'true', false);
-- 删除键或数组元素
SELECT doc - 'temp', doc #- '{a,0}';
MySQLJSON_SET 插或改;JSON_INSERT 只插;JSON_REPLACE 只改;三者都不破坏其它键
PostgreSQLjsonb_set(target, path, value[, create_missing]);删除用 - / #-
注意PG 的新值需要是 jsonb 字面量(字符串要带引号再 ::jsonb)

易错点

  • MySQL JSON_INSERT 对已存在的路径不做任何事(不报错),想“有则改无则插”要用 JSON_SET
  • PostgreSQL 里忘记给字符串值加 JSON 引号(写 'paid' 而不是 '"paid"'::jsonb),取出会变成无引号文本导致类型不一致

数据来源与参考

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