Database 在SQLite中约束列不为NULL的原因是什么?

Database 在SQLite中约束列不为NULL的原因是什么?,database,sqlite,Database,Sqlite,作为数据库和SQL的新手,我想知道在SQLite中创建表时,将约束设置为NOTNULL有什么优点(也许也有缺点) 我知道它可以确保在该列中不输入空值,这是可取的。但除此之外,我想知道它是否会提高任何类型的性能——例如,通过减少表的磁盘空间或提高某些查询的速度。约束不会影响磁盘空间。(在SQLite中,NULL仅为。) NOTNULL约束可以加快某些查询的速度;例如,UNIQUE和NOT NULL约束可以优化一个独特的约束 但是,约束的主要目的是防止编程错误,以便您可以信任数据库包含正确的数据。如

作为数据库和SQL的新手,我想知道在SQLite中创建表时,将约束设置为NOTNULL有什么优点(也许也有缺点)


我知道它可以确保在该列中不输入空值,这是可取的。但除此之外,我想知道它是否会提高任何类型的性能——例如,通过减少表的磁盘空间或提高某些查询的速度。

约束不会影响磁盘空间。(在SQLite中,NULL仅为。) NOTNULL约束可以加快某些查询的速度;例如,UNIQUE和NOT NULL约束可以优化一个独特的约束


但是,约束的主要目的是防止编程错误,以便您可以信任数据库包含正确的数据。

如果某些列构成主键,则它们必须不为NULL。如果它们被外键引用,则它们必须是主键(且不为NULL)或唯一键

NULL允许您在列中包含一个值,该值不是声明该值时使用的类型的值之一。如果不需要或不想要该值,则不希望将其设置为NULL

但是,当列值可以为NULL时,该值将永远不会与任何其他值(包括NULL)进行比较,并且比较结果也为NULL,这将进一步影响正在计算的条件。不管人们怎么说,这种行为不会返回一个结果,就好像空值以某种方式表示未知值、不适用值或任何其他值一样。然而,我们可以编写查询来专门这样做,同时考虑NULL行为,并记住条件在没有NULL的情况下并不意味着它们通常意味着什么。这是SQL错误和复杂性的根源

您永远不需要使用空列。通常,您可以使用一个单独的基表,而不是原始基表中的该列,其中一个或多个键加上该列作为NOTNULL。使用NULL列有时可以保存连接,但有时需要过滤掉带有NULL的行。空版本的总行数较少,但后者通常为每行的每一可空列增加一位或字节

如果您只是使用一个没有空值但带有空值约束的表,它将增加每列每行的空间开销。实际上,这通常是无关紧要的。与此同时,伴随着这些(小)浪费,你正在扔掉完整性检查


因此,如果您有意识地想要NULL,因为基表行中的列的含义包括它不是其类型的值,则将其设置为NULL;如果您有意识地不想要NULL,因为基表行中的列的含义包括它只是其类型的值,则将其设置为非NULL。

声明列可以be NULL不保留给定行和列是否为NULL的附加记录。一般来说,这每列和每行花费一位或一个字节,尽管对于特定情况下的特定DMB,如行中的最后一列,可能不需要额外的存储。@philipxy这个问题是关于SQLite的,(非)NULL约束不会对记录格式产生任何影响。