INNODB->默认列应为零还是为空?

时间:2019-05-09 02:33:10

标签: mysql performance mariadb relational-database innodb

对不起,我的英语不好

使用INNODB时,列必须为0还是为null?

如果联接的列定义为0,会发生问题吗?

最后,在性能方面哪个更好?

谢谢。

1 个答案:

答案 0 :(得分:0)

忽略该问题。您不必提供DEFAULT值。您不必声明一列NULL(或NOT NULL)。

相反...

考虑一下应用程序。

情况1:您的应用程序将总是具有该列的值,并且它将总是指定该值。然后将列声明为NOT NULL而不提供DEFAULT是有意义的。

情况2:您还没有任何价值。示例:该表具有start_dateend_date。您在事物“开始”时创建了一行,因此您填写了start_date(请参阅案例1),但将end_date留为空白。 “空”可以编码为NULLDEFAULT NULL。稍后,您UPDATE在表格中用真实值填充end_date

情况3:该表具有一个“计数器”。最初添加一行时,计数器需要以“ 1”开头。稍后您将UPDATE ... SET counter=counter+1。您既可以在创建行时将“ 1”显式放入,也可以在插入时省略该值,但将列声明为NOT NULL DEFAULT '1'

NULL可以表示“尚未填写”(案例1),“不知道值”,“使用默认值”以及其他一些内容。这是一个应用程序选择。

NULL还有其他用途。除非您用于NULL,否则声明每一列NOT NULL

如果在INSERTing时指定了所有列,则不需要DEFAULTsDEFAULTs是一种便利,而不是必需。如果没有DEFAULT,则数字NOT NULL的列将为“ 0”,而字符串则为''

性能-可能不是问题。您有没有我们应该讨论的特定示例?

JOINing-我将避免加入可能包含NULL的列。这种情况在“现实生活”中很少发生,因为一个人将一列中的行的唯一标识符与另一张表中的一列相结合:

 FROM A  JOIN B  ON B.id = A.b_id

也就是说,B.id可能是B的PRIMARY KEY,因此不能是NULL。另一方面,A.b_id可以是NULL,以指示B中没有与A中的行相对应的行。没问题。