当使用整数列时,最好使用0或NULL来表示无值。例如,如果一个表有一个parent_id字段,而一个特定的条目没有父项,你会使用0还是NULL?我过去总是使用0,因为我来自Java世界(1.5之前)整数总是必须有一个值。我主要是问有关表现的问题,我不太担心哪一个是“更正确”的选择。
0
NULL
parent_id
1u4esq0p1#
最好使用NULL,原因有二:
fumotvh32#
如果可能,将列声明为NOT NULL。它通过更好地使用索引和消除测试每个值是否为NULL的开销,使SQL操作更快。您还保存了一些存储空间,每列一位。如果你真的需要在你的表中使用NULL值,那就使用它们。只要避免允许每列都有NULL值的默认设置即可。MySQL - optimizing data size
9bfwbjaz3#
使用NULL表示“无值”是完全正确的。0是整数的值,因此它有意义。NULL otoh字面意思是没有任何东西,所以没有值。性能可能无关紧要,但是如果您学会正确使用NULL进行编码,使用NULL可能会更快一些。
hgc7kmma4#
在parent_id示例中,0是完全有效的,因为它代表'root'。在大多数情况下,NULL在逻辑上是“无值”的更好选择。不过,据我所知,它对性能没有影响。
fdx2calv5#
您不应该期望看到任何真实的生活中的性能差异
siotufzp6#
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防止执行无用的连接
UNIQUE( id1, id2 )
1, null
JOIN atable ON this.extID = atable.ID
JOIN atable ON this.extID = atable.id AND extID > 0
uwopmtnx7#
我认为,如果你不希望0被用作值,那么可以用0来代替NULL。例如,您的列是一个外键。由于外键通常不以0开始,而是以1开始,这意味着您不会期望将0用作值。然后,您可以使用0表示“否”值状态。在联接中使用它将不匹配其他表上的任何列。因此,具有与NULL相同的效果。但是如果你有一个列,其中的0实际上有一个含义。例如,一个数量字段。除此之外,你还需要表达和清空价值。例如,表示数量尚未输入。那么你需要一个NULL。希望你能理解。
cidc1ykv8#
0仍然是整数列的有效值。因此,必须使用NULL并允许该列为null。另外,如果你只对正数使用integer列,那么你可以对no值使用-1。在您的parent_id引用示例中,使用0,直到您确保没有以id 0开头的引用id为止。
integer
no
-1
disho6za9#
如果你喜欢0,你不能使用外键,因为你不能在Mysql中存储id为0的项(如果是主项),所以唯一可能的方法是null
9条答案
按热度按时间1u4esq0p1#
最好使用
NULL
,原因有二:NULL
用于表示字段没有值,这正是您试图建模的内容。1.如果您决定在将来添加一些引用完整性约束,则必须使用
NULL
。fumotvh32#
如果可能,将列声明为NOT NULL。它通过更好地使用索引和消除测试每个值是否为NULL的开销,使SQL操作更快。您还保存了一些存储空间,每列一位。如果你真的需要在你的表中使用NULL值,那就使用它们。只要避免允许每列都有NULL值的默认设置即可。
MySQL - optimizing data size
9bfwbjaz3#
使用NULL表示“无值”是完全正确的。0是整数的值,因此它有意义。NULL otoh字面意思是没有任何东西,所以没有值。
性能可能无关紧要,但是如果您学会正确使用NULL进行编码,使用NULL可能会更快一些。
hgc7kmma4#
在parent_id示例中,0是完全有效的,因为它代表'root'。在大多数情况下,NULL在逻辑上是“无值”的更好选择。
不过,据我所知,它对性能没有影响。
fdx2calv5#
您不应该期望看到任何真实的生活中的性能差异
siotufzp6#
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
防止执行无用的连接uwopmtnx7#
我认为,如果你不希望0被用作值,那么可以用0来代替NULL。
例如,您的列是一个外键。由于外键通常不以0开始,而是以1开始,这意味着您不会期望将0用作值。
然后,您可以使用0表示“否”值状态。在联接中使用它将不匹配其他表上的任何列。因此,具有与NULL相同的效果。
但是如果你有一个列,其中的0实际上有一个含义。例如,一个数量字段。除此之外,你还需要表达和清空价值。例如,表示数量尚未输入。那么你需要一个NULL。
希望你能理解。
cidc1ykv8#
0
仍然是整数列的有效值。因此,必须使用NULL
并允许该列为null。另外,如果你只对正数使用
integer
列,那么你可以对no
值使用-1
。在您的
parent_id
引用示例中,使用0
,直到您确保没有以id0
开头的引用id为止。disho6za9#
如果你喜欢0,你不能使用外键,因为你不能在Mysql中存储id为0的项(如果是主项),所以唯一可能的方法是null