【问题标题】:INNODB -> Should the default column be zero or null?INNODB -> 默认列应该为零还是空?
【发布时间】:2019-09-26 19:36:49
【问题描述】:

对不起,我的英语有点差

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

如果将连接列定义为 0,是否会出现问题?

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

谢谢。

【问题讨论】:

  • NULL 可能有零存储要求,而零占用空间。这实际上取决于您的数据、列定义等。
  • 这不是 PHP 问题。您是否已经在列中允许 NULL ?如果它是一个整数,我会使用0
  • 使用NULL 表示“未设置值”,您应该是正确的。在 SQL NULL 中,空字符串和 0 都是不同的。坚持第一句中的空定义。
  • 我不知道我还是应该使用 0 还是 null?

标签: mysql performance mariadb relational-database innodb


【解决方案1】:

忽略问题。您不必提供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,您会得到“0”代表数字 NOT NULL 列,或 '' 代表字符串。

性能——可能不是问题。你有什么特别的例子我们应该讨论吗?

JOINing -- 我会避免加入可能包含NULL 的列。这在“现实生活”中很少发生,因为一个列中的行的唯一标识符与另一个表中的列相连接:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    相关资源
    最近更新 更多