MySQL JSON_SET() 处理空数组

标签 mysql mysql-8.0

我有一个这样的表:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  `settings` json NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

INSERT INTO `test` (`id`, `settings`) VALUES 
    ('1', '{\"foo\": {\"bar\": 1}}'),
    ('2', '{\"foobar\": 2}'),
    ('3', '[]');

我想向一行添加一个新设置,所以我尝试了 JSON_SET :

SELECT *, JSON_SET(settings, '$.newFoo', 10) FROM test;

enter image description here

正如你所看到的,它对第3行不起作用。预期结果当然与第4行相同; [] 是 php 中对空数组进行 json 编码的结果(如果该项目没有任何设置)。

可以进行适用于所有情况的单个查询吗?

<小时/>

P.S.:我需要做的是更新,即 UPDATE test SET settings=JSON_SET(...) WHERE id=?;

最佳答案

这也困扰了我很长一段时间,但尝试使用 JSON_ARRAY() 而不是双括号符号“[]”。例如:

INSERT INTO `test` (`id`, `settings`) VALUES 
    ('1', '{\"foo\": {\"bar\": 1}}'),
    ('2', '{\"foobar\": 2}'),
    ('3', JSON_ARRAY());

关于MySQL JSON_SET() 处理空数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57060169/

相关文章:

php - SQLSTATE [HY000] [1049] 未知数据库 'laravel'

mysql - 如何使用 MySQL 8 ST_Distance 计算两个坐标(来自谷歌地图)之间的距离?

mysql - 如何使用 Express 连接 Node.js 和 MySQL 8.0?

php - 等于零的地方太慢了

mysql - 如何使用 MySQL 中每行的动态数据动态更新所有行?

sql - 如何确定 mysql 数据库的类型 : whether it is InnoDB or MyISAM?

php - 如何根据条件从数据库加载

MySQL:查询为父行中的每个主键创建一行

mysql - SQL 脚本排序

mysql - 如何在位列上对 MySQL 表进行分区,并在结果分区上进行子分区