【问题标题】:When to write NOT NULL when creating a MySQL table column创建 MySQL 表列时何时写入 NOT NULL
【发布时间】:2015-07-23 00:21:01
【问题描述】:

在 mysql 字段创建中写“NOT NULL”有什么区别或好处...

例如,如果我正在创建这样的表...

CREATE TABLE IF NOT EXISTS game(
id INT(11) NOT NULL AUTO_INCREMENT,
name VARCHAR(128) NOT NULL,
description VARCHAR(200) NOT NULL,
PRIMARY KEY(id)
)

这里,id 和 name 总是有一个值,所以它们的 NOT NULL 就可以了。我明白了。 但是,描述是一个可选字段,所以它可以是空白的。

那么,在这种情况下,我应该输入 NOT NULL 还是不输入?

【问题讨论】:

  • 想一想当您有一个名为 status 的字段的情况,它可能是 0 1 并且您的应用程序依赖于 0,1 并且没有空值来查看某些事物的状态。
  • 这取决于你。在我看来,如果描述不可用(但可以想象得到),那么它应该是 NULL。
  • 设置 NOT NULL 表示该字段不应为空。如果它可以为空,则保持原样,不要输入NOT NULL,否则一旦字段为空就会提示错误。

标签: mysql sql database null notnull


【解决方案1】:

首先,在你的情况下,你真的不必把NOT NULL,如果你把NOT NULL,当你插入数据到你的数据库中,如果字段使用NOT NULL,它必须把值放到这个但是,正如 paxdiablo 之前提到的,NULL 并不意味着空白字段,因为空白字段可以是很多空格或一个空格。无论如何,如果不是必须在某个字段中具有值,那么您真的不必输入 NOT NULL。(我真的不认为这与脑死亡 DBMS 或 @paxdiablo 无关)

【讨论】:

  • 我对任何特定 DBMS 的脑死亡的评论与它无法区分某些数据类型的 ''NULL 的事实有关。这不是讨论的中心,我不能放弃一些抨击拉里的机会:-)
【解决方案2】:

我的看法是,NOT NULL 是针对那些具有依赖关系的字段,例如主键、外键。

我以前在函数中工作的内容(a,b,c,d,e);不输入外键值,执行但不返回结果,增加auto_increment值。这不是一个好习惯。如果使用NOT NULL,当外键值为NULL时停止插入,auto_increment值不会增加。

加法

要处理父记录删除,有一个级联操作,或者您可以让它手动更新记录的另一个值。

【讨论】:

    【解决方案3】:

    NULL 和空白字段是 not the same thing(除非在某些情况下,您是一个脑死亡的 DBMSOracle)。

    NULL 表示未知或不适用,而空白字段表示已知和空白。

    这完全取决于您希望如何处理字段本身。例如,让我们考虑一下您名字的中间名首字母。如果您不想区分“未知”和“没有”,请将列设置为 NOT NULL 并使用空白值来表示两者 - 这会稍微简化您的查询。

    但是,如果您想邮寄所有没有中间名的客户(无论出于什么奇怪的原因),而又不打扰那些您不知道的客户知道是否有中间名,那么您需要能够区分两个类之间。

    【讨论】:

    • 如果您想通过电子邮件向所有人发送全名,包括中间名(如果他们有中间名)怎么办?
    • @Strawberry:假设允许为空,类似于select first || ' ' || last as full from table where middle is null or middle = '' union all select first || ' ' || middle || ' ' || last as full from table where middle <> ''。如果列不可为空,则稍微容易一些。
    • 这比 CONCAT_WS() 容易??我不同意
    • @Strawberry,这就是为什么我说“某事 like” :-) 在任何情况下,concat_ws 仍然需要联合,除非您想要多个连续的分隔符用于那些没有一个中间名,是吗?
    • 考虑替代方案:create table x (a varchar(10), b varchar(10), c varchar(10)); insert into x values ('pax', NULL, 'diablo'); insert into x values ('george', 'w', 'bush'); select concat_ws('@',a,b,c) from x; 好了,现在不是更好。
    猜你喜欢
    • 2012-10-03
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2016-01-01
    • 2022-11-03
    • 2018-11-10
    • 2014-09-15
    • 2018-09-12
    相关资源
    最近更新 更多