Database 将所有数据库列设置为NOTNULL是一种好的做法吗?

Database 将所有数据库列设置为NOTNULL是一种好的做法吗?,database,Database,通常,将所有数据库列设置为NOTNULL或NOT是一种好的做法吗?证明你的答案正确。否。在适当的地方将列设置为空是个好主意。我有点不同意“在适当的地方”规则。将任何列设置为非空实际上是相当安全的;然后在需要时修改列以允许空值。另一方面,如果您先允许空值,然后又决定不允许空值,那么这样做可能会困难得多 如果您这样做过多,可能会使您的数据库表/列描述非常难看,但如果有疑问,请继续并限制数据。简短回答:这取决于您存储的内容 我可以看到一个(或两个)表的所有值都不是空值或都是空值。但是整个数据库?仅适用

通常,将所有数据库列设置为NOTNULL或NOT是一种好的做法吗?证明你的答案正确。

否。在适当的地方将列设置为空是个好主意。

我有点不同意“在适当的地方”规则。将任何列设置为非空实际上是相当安全的;然后在需要时修改列以允许空值。另一方面,如果您先允许空值,然后又决定不允许空值,那么这样做可能会困难得多


如果您这样做过多,可能会使您的数据库表/列描述非常难看,但如果有疑问,请继续并限制数据。

简短回答:这取决于您存储的内容


我可以看到一个(或两个)表的所有值都不是空值或都是空值。但是整个数据库?

仅适用于没有值的列


空值可以非常方便;一方面,它们压缩得很漂亮。但是,当你不期望它们出现时,它们可能会是一个令人讨厌的惊喜,因此如果你不能让一个学生没有名字,请将该列设置为非空。(另一方面,中间名…可能您想要一个默认的空字符串,可能不需要--两种方式都有合适的参数)

您不应该忘记在需要时设置NOTNULL,如果适用,使用check约束,不要忘记唯一约束,创建适当的索引,并在每次用餐后和睡觉前刷牙:)


在大多数情况下,您可以使用NOTNULL,并且应该使用NOTNULL。更改not null->null比更改相反方向更容易,但例如在Oracle中,空字符串被视为null,因此很明显,您不能一直使用它。

这取决于您尝试执行的操作,但是对于许多应用程序来说,尽可能避免
NULL
s是一个好主意,最简单的方法是使用
notnull

问题是
NULL
的含义是可以解释的。它可能意味着“没有值属于这里”,也可能意味着“我们还没有得到值,所以我们应该不断向用户索要。”如果您正在使用它,您将需要阅读SQL和函数,如
COALESCE
,等等


尽管如此,正如克莱特斯和其他人所说,如果你适当地使用
NULL
,它可能是有用的。

空引用的发明者(1965年)最近称其为“十亿美元的错误”:

默认情况下,Scala、SML和Haskell等语言是非NULL的:NULL称为“Option”或“Maybe”,需要特殊的语法和检查

自从数据库发明以来,默认允许NULL被认为是越来越危险和不可取的。数据库应该跟进吗?可能吧


尽可能使用NOTNULL。

IMO必须最小化使用NULLable选项。应用程序应为“不存在”状态指定合适的值。我认为,在Peoplesoft中,应用程序在不存在值的地方为数值设置0,为字符列设置空格

有人可能会争论为什么所谓的合适值不能为NULL

因为SQL实现对null的处理完全不同

例如。 1=NULL和0=NULL都会导致false! NULL=NULL为假!
GROUP BY和其他聚合函数中的NULL值也会产生意外的结果。

从我的角度来看,这可能对数据库更好,但对用户来说却不是更好。一旦进入更具交互性的应用程序,您就希望能够将数据保持在一种过渡状态,因此此时大多数字段可能为空。

关系理论认为
null
是邪恶的

然而,你的问题有点涉及实践

因此,如果你希望你的实践符合理论的神圣理想,是的,要避免无效,就像瘟疫、霍乱和艾滋病是一体的一样

在某种程度上,这些被称为“SQL DBMS”的蹩脚实现不会给您留下任何其他选择,是的,(嗅探)使用它们

编辑


有人在接受的答案中提到“业务规则”作为“适当性”的准则,还有人对这句话投了赞成票。那完全是胡说八道。业务规则总是可以不使用
NULL
s,而“适当性”的唯一准则就是任何SQL系统的不足之处,这使得它成为一个非关系系统来引导。

如果在插入时无法知道值,那么必须允许使用NULL。例如,假设您有一个包含两个字段的记录,开始日期和结束日期。插入记录时您知道开始日期,但不知道结束日期。至少可以说,创建一个假日期放在这个字段中只是为了避免空值


在现实生活中,强制将数据输入字段所造成的危害至少与不强制输入字段所造成的危害一样大。如果您有一个电子邮件字段,但不知道客户的电子邮件,那么用户必须在必填字段中添加一些内容。很可能他们编造的东西可能不是你想要他们编造的东西”thisistupid@ass.com". 有时,这些糟糕的信息会在数据提要中反馈给客户或供应商,而您的公司看起来真的很愚蠢。我知道,我处理了很多来自客户的反馈。电子邮件领域的好东西包括,“他的秘书是个金发胖子”,“这个家伙是个混蛋”等等。

在商业应用程序中,我总是删除我的NOT NULLS,因为用户不喜欢被迫输入他们不知道的数据。这取决于表,但我将我的大多数字段设置为NULL,并且只将最小字段数设置为NOTNULL。

如果您的数据实际上可能是“未知”的,并且记录这一事实很重要,那么可以使用NULL。请记住,有时您需要区分“未知”和“不相关” CREATE TABLE Computer ( Id INT IDENTITY PRIMARY KEY , Name NVARCHAR(16) NOT NULL , ...[other fields]... , Comments NVARCHAR(255) NOT NULL CONSTRAINT DF_Computer_Comments DEFAULT (N'') )