使用整数列时,最好使0
或NULL
表示没有值。
例如,如果表中有一个parent_id
字段,而某个特定条目没有父级,您会使用0
还是NULL
?
过去我总是使用0
,因为我来自Java世界,整数(必须小于1.5)必须始终具有值。
我主要是询问绩效,我不太担心哪个是“更正确的”选项。
优选使用NULL
,这有两个原因:
NULL
用于表示该字段没有值,这正是您要建模的值。NULL
。如果可能,将列声明为NOT NULL。通过更好地使用索引并消除测试每个值是否为NULL的开销,它可以使SQL操作更快。您还节省了一些存储空间,每列一位。如果您的表中确实需要NULL值,请使用它们。只是避免使用默认设置,该默认设置允许每列中都为NULL值。
使用NULL表示“无值”在字面上是正确的。 0是整数值,因此具有含义。NULL otoh从字面上意味着没有任何东西,因此没有价值。
性能可能无关紧要,但是如果您学习正确地使用NULL进行编码,则使用NULL可能会更快一些。
您不应该期望由此看到任何现实生活中的表现差异
在您的parent_id示例中,0完全有效,因为它代表'root'。在大多数情况下,从逻辑上讲,NULL是“无值”的更好选择。
不过,我对性能没有任何影响。
[UNIQUE( id1, id2 )
将不能使用空值,因为它将允许,例如两次1, null
另一方面,如果您使用0,则将执行JOIN atable ON this.extID = atable.ID
连接(导致没有连接的行),而NULL将被忽略
无论如何,我建议始终使用“空值”(例如0或空字符串)而不是NULL,除非该空值与NULL的含义不同
而且我还像这样修改查询:JOIN atable ON this.extID = atable.id AND extID > 0
阻止执行无用的联接
0
仍然是有效值。因此,您必须使用NULL
并在该列上允许null。
此外,如果仅将integer
列用于正数,则可以将-1
用于no
值。
在您要使用parent_id
的0
引用示例中,直到您确保没有以id 0
开头的引用id都可以。
我认为如果您实际上并不希望将0用作值,则可以使用0而不是NULL。
例如,您的列是外键。由于外键通常不是以0开头,而是以1开头,这意味着您不会期望将0用作值。
然后您可以使用0表示'否'值状态。在联接中使用它不会匹配另一个表上的任何列。因此,具有与NULL相同的效果。
但是如果您有一列,其中0实际上具有含义。例如,数量字段。除此之外,您还需要表达和空值。例如,表示尚未输入数量。然后您需要一个NULL。
希望如此。