You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用UPDATE JOIN JSON_TABLE无法为可空字段更新NULL值的问题

JSON_TABLE关联更新时设置NULL值报错的原因与解决

问题描述

我创建了包含product_value字段(类型为decimal(11,2) NULLABLE)的TABLE_A表,尝试通过JSON_TABLE关联更新语句将该字段设为NULL:

UPDATE TABLE_A src 
JOIN JSON_TABLE("[{\"id\":1,\"product_value\":null}]",'$[*]' COLUMNS 
(id int(11) PATH '$.["id"]',
product_value decimal(11,2) PATH '$.["product_value"]' NULL ON EMPTY)) as target 
ON src.id = target.id 

SET 
src.product_value = null
where src.id = 1;

执行后报错:

Invalid JSON value for CAST to DECIMAL from column product_value

但使用普通表关联的更新语句可以成功将该字段设为NULL:

UPDATE TABLE_A src 
JOIN  TABLE_B as target ON src.u_id = target.u_id 
SET src.product_value = null
WHERE src.id = 1

疑问:为何使用JSON_TABLE关联时无法更新NULL值?如何解决?

原因分析

你在JSON_TABLE中只指定了NULL ON EMPTY,这个选项仅处理JSON字段不存在或者字段值为空字符串的场景,会将其转换为SQL NULL。但你的JSON数据里明确存在product_value: null(JSON类型的null),这不属于EMPTY的范畴,MySQL会尝试将JSON null直接转换为decimal(11,2)类型,而JSON null无法直接被CAST为数值类型,因此触发报错。

而普通表关联时,目标表的字段本身就是SQL NULL,不存在类型转换的问题,所以可以正常执行。

解决建议

在JSON_TABLE的product_value字段定义中添加NULL ON NULL选项,让MySQL将JSON类型的null转换为SQL NULL,修改后的SQL语句如下:

UPDATE TABLE_A src 
JOIN JSON_TABLE("[{\"id\":1,\"product_value\":null}]",'$[*]' COLUMNS 
(id int(11) PATH '$.["id"]',
product_value decimal(11,2) PATH '$.["product_value"]' NULL ON EMPTY NULL ON NULL)) as target 
ON src.id = target.id 

SET 
src.product_value = null
where src.id = 1;

如果需要同时覆盖字段不存在、空值、JSON null三种场景,NULL ON EMPTY NULL ON NULL是最全面的写法;如果只需要处理JSON null的情况,单独添加NULL ON NULL也可以解决当前问题。


内容的提问来源于stack exchange,提问作者Nam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:50:06