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()

MYSQL JSON_SET 添加反斜杠

带有Python的Mysql无法插入具有自动增量ID的记录,为啥?

具有 DEFAULT NULL 的 MySQL 列 - 风格选择,或者是它?

c++ ListView - 使用 ListView_DeleteAllItems 后无法插入新项目