【发布时间】:2011-01-11 01:47:06
【问题描述】:
谁能解释NULL 在数据库表中的用法?它是做什么用的,有什么用处?
【问题讨论】:
标签: database-design
谁能解释NULL 在数据库表中的用法?它是做什么用的,有什么用处?
【问题讨论】:
标签: database-design
来自Wikipedia:
由创建者介绍 关系数据库模型,E. F. Codd, SQL Null 用于满足 要求所有真正的关系 数据库管理系统(RDBMS) 支持“失踪”的表示 信息和不适用 信息”
【讨论】:
这就像一个充满“我不知道”或“没关系”的列。例如,在客户表中,如果他们不填写电话号码,您在电话号码字段中输入什么?
【讨论】:
表示缺少任何值。
NULL 可用于在表中存储可选数据。假设您有一张汽车桌。并非所有汽车都有后备箱...所以他们的 TrunkSpace 列可能是 NULL
【讨论】:
标记“未知”或缺失值很有用。
例如,如果您要存储人,并且其中一个字段是他们的生日,您可以将其设为 NULL 以表示“我们不知道他何时出生”。
这与具有不可为空的字段形成对比,在这些字段中,对于相同类型的含义,您需要指定一个具有相同含义的“魔术值”。
例如,您应该在生日字段中存储什么日期来表示“我们不知道他何时出生”? 1970-01-01 应该是那个神奇的值吗?如果我们突然需要存储当天出生的人怎么办?
话虽如此,NULL 是数据库设计和引擎中更难处理的问题之一,因为它是值的传播属性。
例如,下面的结果是什么:
SELECT *
FROM people
WHERE birthday > #2000-01-01#
SELECT *
FROM people
WHERE NOT (birthday > #2000-01-01#)
(注意,上面的日期语法在任何数据库引擎中可能都不合法,不要挂在上面)
如果您有很多人的生日“未知”,即。 NULL,它们不会出现在任何一个结果中。
由于在上述两个查询中,第一个是“所有符合条件 X 的人”,第二个是“所有没有条件 X 的人”,你会认为这两个查询的结果加在一起会产生所有数据库中的人。
但是,查询实际上是说“所有具有已知和明确标准 X 的人”。
这类似于问某人“我是否超过 40 岁?”对方说“我不知道”。如果你接着问“我是不是不到 41 岁?”,答案还是一样的,他还是不知道。
此外,任何数学或比较也会产生NULL。
例如,什么是:
SELECT 10 + NULL AS X
结果是NULL,因为“10 + 未知”仍然未知。
【讨论】:
我喜欢 JRL/维基百科的回答。当您不想将其默认为实际值时,有时需要用 NULL 填充列。我的意思是,当您使用 varchar 时,有时可以使用空字符串而不是 NULL。但是位或日期类型呢?如果使用位列,则将其默认为 0 或 1 可能还不够。日期类型的默认日期应该是什么?
在某些系统中使用 NULLS 还有一个原因。 SQL Server 2008 引入了 sparse columns 的概念,它优化了 NULL 值的存储。当您的列可能大部分为空(或者准确地说大部分为 NULL)时,最好使用它们。
【讨论】:
“它是做什么用的,有什么用处?”
用于“解决”(请注意引号)处理缺失信息的问题。
它对于制造大量软件设计问题和软件实现问题(其中最明显的问题可以概括为“(x == y)==!(x == y)”)很有用,或者换句话说:它有助于为那些声称空值不可避免的程序员创造工作保障。
【讨论】:
请查看this question。
“Null”的意思是“没有任何价值”,但也可以是“未知的价值”,因此它的解释有时会模棱两可。想想一个人表,其中包含出生日期和驾驶执照 n# 字段。如果出生日期字段没有值,则显然意味着日期未知(每个人都出生在这些日子之一......)。现在,如果驾驶执照字段没有任何值,是否意味着该人没有驾驶执照,或者是否意味着其 n# 未知?
【讨论】:
在将特定记录插入数据库时,它只是表示“缺失值”或“未知值”。
【讨论】: