mysql生成的int culumns不能为空吗?

问题描述 投票:0回答:1

使用Mysql,如下表:

CREATE TABLE participants (
    id INT AUTO_INCREMENT PRIMARY KEY,
    puuid CHAR(36) NOT NULL,
    data JSON,
    project INT GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.project'))) STORED NULL,
    schoolCode VARCHAR(255) GENERATED ALWAYS AS (JSON_UNQUOTE(JSON_EXTRACT(data, '$.schoolCode'))) STORED,
    UNIQUE KEY (puuid)
);

当我尝试跑步时:

insert into participants(puuid,data) values('aasd','{"project":1}');

工作没有问题 但当我尝试时

insert into participants(puuid,data) values('aasd1','{"project":null}');

我收到一条错误消息:

Error Code: 1366. Incorrect integer value: 'null' for column 'project' at row 1

我仔细检查了使用

 show columns from participants;

返回

为什么它不允许 JSON 在项目中具有空值,即使它声明项目列允许空值?

除了类似以下内容之外,没有其他解决方案吗?

project INT GENERATED ALWAYS AS (COALESCE(JSON_UNQUOTE(JSON_EXTRACT(data, '$.project')), 0)) STORED NULL,
mysql mysql-workbench
1个回答
0
投票

缺失的 JSON 密钥会提取为 SQL

NULL

mysql> select json_extract('{"project":null}', '$.xyzzy') is null as is_it_null;
+------------+
| is_it_null |
+------------+
|          1 |
+------------+

JSON

null
值不会提取到 SQL
NULL
。它提取为 JSON 文档,即标量值
'null'

mysql> select json_extract('{"project":null}', '$.project') is null as is_it_null;
+------------+
| is_it_null |
+------------+
|          0 |
+------------+

JSON_UNQUOTE()
不会将 JSON 值
'null'
转换为 SQL
NULL
。它将其转换为 SQL 字符串值
'null'

mysql> select json_unquote(json_extract('{"project":null}', '$.project')) is null as is_it_null;
+------------+
| is_it_null |
+------------+
|          0 |
+------------+

您可以通过将该字符串值与

'null'
进行比较并用这种方式替换 SQL NULL 来修复它:

mysql> select nullif(json_unquote(json_extract('{"project":null}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
|          1 |
+------------+

但这无法与JSON字符串值区分开来

'null'
:

mysql> select nullif(json_unquote(json_extract('{"project":"null"}', '$.project')), 'null') is null as is_it_null;
+------------+
| is_it_null |
+------------+
|          1 |
+------------+

基本上,JSON 与 SQL 结合起来就是一团乱麻。有如此多的边缘情况以违反直觉的方式运行,我不得不说这是多年来添加到 SQL 中的最糟糕的功能。

© www.soinside.com 2019 - 2024. All rights reserved.