mysql JSON_SET 无法插入具有 NULL 值的列(5.7+)
Posted
技术标签:
【中文标题】mysql JSON_SET 无法插入具有 NULL 值的列(5.7+)【英文标题】:mysql JSON_SET can't insert into column with NULL value(5.7+) 【发布时间】:2017-04-15 06:45:00 【问题描述】:我正在探索较新的 mysql 服务器的 JSON 函数。但是遇到了一个非常初级的问题。
当我不知道当前值是否为 NULL 时,如何将 "key":"value" 插入 JSON 列?
表格仅供参考:
CREATE TABLE `testjson` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`extra` JSON NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
使用 NULL 和有效 json 值测试数据。
| id | extra |
| -: | - |
| 1 | (NULL) |
| 2 | "name": "james" |
期望的结果:
| id | extra |
| -: | - |
| 1 | "age": 87 |
| 2 | "age": 87, "name": "james" |
现在,我尝试将 "age":87 添加到所有行中:
UPDATE testjson
SET extra = JSON_SET(extra,'$.age', 87)
;
UPDATE testjson
SET extra = JSON_MERGE(extra,JSON_OBJECT('age', 87)),
;
以上都没有更新 NULL 字段。尝试将列默认设置为,但不允许。
因为 NULL 不是有效的 JSON 数据,所以 mysql JSON 函数都不起作用: https://dev.mysql.com/doc/refman/5.7/en/json-function-reference.html
我目前的工作是在插入之前将 NULL 设置为,但这很愚蠢。一个简单的更新不应该使用两个查询。
你们是怎么处理的?
【问题讨论】:
检查是否有 NULL 值(控制流函数),如果有,请使用 create JSON 的函数之一 ...? dev.mysql.com/doc/refman/5.7/en/json-creation-functions.html 试试:UPDATE `testjson` SET `extra` = IF(`extra` IS NULL, JSON_OBJECT('age', 87), JSON_INSERT(`extra`, '$.age', 87));
.
【参考方案1】:
使用COALESCE:
UPDATE testjson SET extra = JSON_SET(COALESCE(extra, ''), '$.age', 87);
【讨论】:
非常好!谢谢! 只是一个警告,我遇到了这样一个事实COALESCE 对我来说并没有开箱即用。 后续:我发现除了… SET extra = JSON_SET(IF(JSON_TYPE(extra) = 'NULL', "", extra), "$.age", 87)
之外别无他法(适应你的样本ofc)
@AdrianFöder 应该是 SET extra = JSON_SET(IF(JSON_TYPE(extra) is NULL, "", extra), "$.age", 87)
【参考方案2】:
SET extra = JSON_SET(IFNULL(extra, ""), "$.age", 87)
【讨论】:
喜欢这个解决方案,超级简单:)以上是关于mysql JSON_SET 无法插入具有 NULL 值的列(5.7+)的主要内容,如果未能解决你的问题,请参考以下文章
mysql数据库中,如何对json数据类型的值进行修改?通过json_set函数对json字段值进行修改?
如何在 jOOQ for MySQL 8 中实现 JSON_SET()
带有Python的Mysql无法插入具有自动增量ID的记录,为啥?