MySQL查询字段为空时替换(补充)为0

你好,给你说一下我当年遇到的一个坑。
当时,我正在帮助一个朋友构建一个电子商务后端。
他的数据库中许多订单金额字段都是空的。
我检查的时候,看起来很乱,所以我想立即将其标记为0。
我一开始就是这么想的,也尝试了很长时间。
最后,我使用了 IFNULL 函数,它确实有效。

我记得那是2 007 年,当时我经常使用MySQL。
他的表叫order_info,字段叫order_amount,就是订单金额。
很多行都是空的,我检查的时候都是白色的,看起来不太好。
我写了SQL,直接进入:
sql SELECT IFNFULL(order_amount, 0) AS order_info 中的金额;
就是这么简单。
IFNULL 检查 order_amount 是否为空。
如果为空,则给出 0。
如果不为空,则给出原始值。
既然您知道空数据突然变为零,那么查看统计数据就容易多了。

后来他问如果这个字段是小数类型,小数点不对齐怎么办。
当我看到它时,我想,啊,这个问题需要解决。
我使用CAST去掉小数点并转换为varchar或int。
但仔细想想,似乎和用空值替换0关系不大,主要是为了排序。
因为当时数据量不是很大,也就几百、几千万条,所以做的还算顺利。

后来,我遇到了更令人沮丧的情况。
有一个字段,其中空字符串可能意味着空而不是 NULL。
那么,IFNULL 将不起作用,您必须使用 CASE。
正如你所说:
sql SELECT CASE WHEN order_amount = '' OR order_amount IS NULL THEN 0 ELSE CAST(order_amount AS DECIMAL(1 0, 2 )) END AS amount FROM order_info;
这会导致所有空字符串和NULL都变成0,非空字符串按原样转换为十进制格式。
大概是1 0年前,数据量就有几千万。
我运行了几分钟就完成了。
他的报告看起来好看多了。

无论如何,根据我的经验,IFNULL 非常擅长处理 NULL。
其他情况则视具体情况而定。
CASE 语句应该更加灵活。
但最重要的是,您需要知道表中的字段是什么。
空就是空,空串就是空串。
别混淆了。
当时我弟弟的数据就因为这个错了一半,我就给他擦了两天屁股。

mysql 主键可以为空吗

哦,2 02 2 年有一个城市,他们的数据库出了问题。
我一看,是的,主键是空的。
当时我很困惑。
我应该怎么办?后来我发现主键不能为空。
这是数据库设计的一个基本原则。
主键必须唯一标识每一行数据。
如果不是独一无二的话。
这称为主键。
让我举个例子。
在用户表中,主键是ID。
如果 id 可以为空,则两个用户具有相同的名称,并且 id 将为空。
这不会让人困惑吗?
此外,主键必须按顺序排列。
MySQL 使用 B+ 树索引来管理主键。
如果主键为空;索引会变得混乱,查询效率会降低。
当森林量很大时,我计算过查询响应时间可以增加一个因子或多个倍。
这样的用户体验能好吗?
此外,空主键可能会导致一些未指定的行为,例如安装失败和更新错误。
从长远来看,这也会影响数据完整性。
我见过orders表的主键order_id允许为空的情况。
结果,当其他表通过order_id连接订单时;关联被空值破坏,业务逻辑是绝对的真是一团糟。

我写了一段SQL代码,参见:创建表时;设置主键id为非空;然后尝试插入一条主键为空的记录;会直接报错。
这证明了主键的非空性。

因此,主键设计必须选择正确的自增整数或UUID策略。
不要使用字段并小心组合键。
总之,主键不为空是数据库设计的铁律,不能违反。
是数据的唯一性;与索引效率和系统稳定性有关。
如果你违反了它,你就会受苦。

MySQL InnoDB中空字符、0和NULL值究竟占用多少存储空间?

我记得在一个项目中,特别关注InnoDB存储引擎中不同数据类型占用的存储空间,以优化数据库性能。
我有一个带有 VARCHAR(2 5 5 ) 字段的表,其中包含大量空字符串。
一开始以为会占用很大的空间,但是查资料才发现,空字符串只占用2 个字节,长度信息和空内容各占1 个字节。
我突然想到,如果这个字段中的大部分数据都是空字符串,那么允许 NULL 值实际上可能会节省更多空间,因为 NULL 值不占用任何磁盘空间。
但我又开始怀疑,如果以后数据量增大,NULL值过多,是否会影响查询性能。