如何在实际工作中处理 NULL,并给出一些指南
2.9 消灭 NULL 委员会
本节将从 NULL 的问题讲起,主要介绍一些避免问题的具体方法。不 过这些方法执行起来非常简单,只需在设计的时候稍微注意一下就行,因 此这里不作详细讲解。本节将揭示这些方法,当然笔者也希望大家都加入 到消灭 NULL 的运动中来
为什么 NULL 如此惹人讨厌
- 在进行 SQL 编码时,必须考虑违反人类直觉的三值逻辑。
- 在指定 IS NULL、 IS NOT NULL 的时候,不会用到索引SQL 语句执行起来性能低下。
- 如果四则运算以及 SQL 函数的参数中包含 NULL,会引起“NULL的传播”。
- .在接收 SQL 查询结果的宿主语言中, NULL 的处理方法没有统一标准。
- 与一般列的值不同, NULL 是通过在数据行的某处加上多余的位(bit)来实现的。因此 NULL 会使程序占据更多的存储空间,使得检索性能变差.
无法完全消除 NULL 的原因是它扎根于关系数据库的底层中。仅仅靠
在表中所有列加上 NOT NULL 的约束是不够的。因为即使这样做,在使用
外连接,或者 SQL-99 中添加的带 CUBE 或 ROLLUP 的 GROUP BY 时,还是很
容易引入 NULL 的。因此我们能做的最多也只是“尽量”去避免 NULL 的产生。
实际上,如果合理利用, NULL 还是有很多非常方便的用途的。但问题是,“合
理使用”NULL 正是最困难的地方。 NULL 最恐怖的地方就在于即使你认为自
己已经完全驾驭它了,但还是一不小心就会被它在背后捅一刀.
我们可以把 NULL 视为一种药品:适当使用可能有益,但滥用会导致毁灭。
最好的策略是尽可能地避免适用 NULL,并在不得不使用时适当使用。
接下来我们分几个场景来讨论一下消除 NULL 的具体做法.
1 编号 : 使用异常编号
2 名字 : 使用“无名氏”
3 数值 : 用 0 代替
因此更加可行的方案是下面这样的方案。
- 转换为 0。
- 如果一定要区分 0 和 NULL,那么允许使用 NULL。
- 如果能转换为 0,希望大家还是尽量把 NULL 转换为 0。
4 日期 : 用最大值或最小值代替
结束语:至此,我们分 4 种数据类型介绍了消除 NULL 的具体方法,这里总结如下。
(1) 首先分析能不能设置默认值。
(2)仅在无论如何都无法设置默认值时允许使用 NULL