使用整数列时,最好使用0或NULL来表示没有值。例如,如果表具有parent_id字段且特定条目没有父项,则使用0或NULL。我过去总是使用0,这是因为我来自Java世界,其中(1.5之前)整数总是必须有一个值。我主要是关于性能问题,我不太担心哪个是“更正确”的选项。
答案 0 :(得分:26)
最好使用NULL
,原因有两个:
NULL
用于表示该字段没有值,这正是您尝试建模的内容。NULL
。答案 1 :(得分:23)
如果可能,将列声明为NOT NULL。它通过更好地使用索引并消除测试每个值是否为NULL的开销,使SQL操作更快。您还可以节省一些存储空间,每列一位。如果您确实需要表中的NULL值,请使用它们。只需避免在每列中允许NULL值的默认设置。
答案 2 :(得分:6)
使用NULL表示"没有值"确实是对的。 0是整数的值,因此它具有含义。 NULL otoh字面意思是什么都没有,所以没有价值。
性能可能无关紧要,但如果你学会正确使用NULL编码,那么使用NULL可能会更快一些。
答案 3 :(得分:3)
您不应期望看到与此
的任何真实性能差异答案 4 :(得分:2)
在你的parent_id示例中,0完全有效,因为它代表'root'。在大多数情况下,NULL是逻辑上“无价值”的更好选择。
虽然它没有我所知道的性能影响。
答案 5 :(得分:2)
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
这样的查询,这会阻止执行无用的连接
答案 6 :(得分:1)
0仍然是整数列的有效值。因此,您必须使用NULL并在该列上允许null。此外,如果仅使用整数列作为正数,则可以使用-1表示无值。
在使用0的parent_id引用的示例中,在确保没有以id 0开头的引用ID之前一切正常。
答案 7 :(得分:1)
我认为如果你实际上不希望将0用作值,则可以使用0而不是NULL。
例如,您的列是外键。由于外键通常不以0开头,而是以1开头,这意味着您不会期望将0用作值。
然后,您可以使用0表示“否”值状态。在连接中使用它不会匹配另一个表上的任何列。因此,具有与NULL相同的效果。
但是如果你有一个0实际上有意义的列。例如数量字段。除此之外,你还需要表达和空洞的价值。例如,表示尚未输入数量。然后你需要一个NULL。
希望这是有道理的。