SQL如何更新JSON字段中的指定属性

落伟大大_1362

落伟大大_1362

2026-08-03

599人浏览

原创

应使用json_set()函数,它可精准修改指定路径键值、自动创建缺失层级、保留其余结构;需确保字段为json类型、路径用双引号包裹且合法,否则更新可能静默失败。

sql如何更新json字段中的指定属性

MySQL 8.0+ 如何用 JSON_SET 更新 JSON 字段的某个键

直接改 JSON 字段里的某个属性,别用字符串拼接或全量覆盖——JSON_SET 是最稳妥的选择。它只修改目标路径,保留其余结构,还能自动创建缺失的中间层级。

常见错误是把路径写成 "$.name" 却忘了字段本身是 JSON 类型,结果更新无声无息(实际没生效),或者路径含空格/特殊字符时没加引号导致语法报错。

  • JSON_SET 第一个参数是字段名(如 data),第二个是路径表达式(如 "$.user.email"),第三个是新值(支持字符串、数字、NULL)
  • 路径必须用双引号包裹,且是合法 JSONPath;嵌套对象用点号,数组用方括号(如 "$.items[0].price")
  • 如果路径不存在,JSON_SET 默认会创建父级结构;想避免意外建层,可先用 JSON_CONTAINS_PATH 判断
  • 注意:MySQL 对 JSON 字段大小有限制(默认 1GB),高频小更新比全量 UPDATE 更安全

示例:

Browser Js
Browser Js

轻量级CDP浏览器控制,适用于AI代理。相较于内置浏览器工具,token消耗降低3‑10倍,仅在浏览时使用。

下载
UPDATE users SET data = JSON_SET(data, "$.profile.phone", "138****1234") WHERE id = 123;

PostgreSQL 怎么用 jsonb_set 替换 JSONB 中的字段

PostgreSQL 没有 JSON_SET,得用 jsonb_set,而且路径必须是 text[] 数组形式,不是字符串路径——这是最容易卡住的地方。

典型现象:写成 jsonb_set(data, '$.email', ...) 直接报错“function does not exist”,因为第一个路径参数必须是 ARRAY['profile', 'email'] 这种。

  • 路径数组里每个元素对应一级 key;数组索引用字符串表示,如 ARRAY['items', '0', 'qty']
  • 第四个参数 create_missing 设为 true 才会补全缺失路径,否则路径不存在就返回原值(不报错但也不生效)
  • 如果要删某个 key,不能传 NULL 值,得用 jsonb_set(..., ..., '{}'::jsonb, true) 配合 - 操作符
  • jsonb_set 返回的是新 jsonb 值,必须显式赋给字段,不会原地修改

示例:

UPDATE users SET data = jsonb_set(data, ARRAY['profile','avatar'], '"https://...jpg"', true) WHERE id = 123;

SQLite 3.38+ 的 json_set 函数怎么用(不是 MySQL 那个)

SQLite 的 json_set 行为和 MySQL 接近,但路径格式更宽松,也支持多路径批量更新——不过得确认你用的是 3.38 或更高版本,低版本压根没有这个函数。

容易踩的坑是误以为 SQLite 支持 $.key 写法,其实它只认 key、key.subkey 这种点分隔形式,不认 $ 前缀;另外,传入非 JSON 字符串会静默失败(字段不变)。

  • 路径不用引号,直接写 user.email;数组索引用 items.0.price
  • 支持一次更新多个路径:json_set(data, 'a', 1, 'b.c', 'x')
  • 如果字段当前是 NULL 或不是有效 JSON,json_set 返回 NULL,建议用 COALESCE 包一层
  • SQLite 的 JSON 函数全是纯函数,不修改原值,必须配合 UPDATE SET 显式赋值

示例:

UPDATE users SET data = json_set(data, 'profile.bio', 'dev') WHERE id = 123;

跨数据库兼容写法为什么几乎不存在

别试图写一条 SQL 通吃 MySQL、PG、SQLite —— 路径语法、函数名、NULL 处理、数组索引写法全都不一样,硬凑只会埋下运行时错误。

真正可行的做法是在应用层做适配:比如封装一个 updateJsonField(table, field, path, value) 方法,内部按方言调用不同 SQL 模板。否则上线后某条语句在 PG 成功、在 MySQL 把整个 JSON 字段清空,这种问题很难排查。

尤其注意 PostgreSQL 的 jsonb 和 MySQL 的 JSON 类型虽然都叫 JSON,但底层序列化方式不同,导出导入可能丢失精度或顺序;SQLite 的 JSON 只是文本校验,没类型约束。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4123

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

871

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1069

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6001

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2883

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

5980

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8001

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1090

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

952

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
FastAPI SQL数据库实战文档
FastAPI SQL数据库实战文档

共0课时 | 0人学习

Java JDBC数据库连接官方教程
Java JDBC数据库连接官方教程

共0课时 | 0人学习

PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 183人学习