【问题标题】:MySQL - Are "NOT NULL" constraints needed for primary keys?MySQL - 主键是否需要“NOT NULL”约束?
【发布时间】:2012-05-05 14:45:25
【问题描述】:

是否需要为 MySQL 数据库中的主键声明“NOT NULL”约束?主键不能有 NULL 值,因为它无论如何都会自动递增并自动填充字段记录。那么我是否正确地说这意味着我可以删除主键的“NOT NULL”约束?

【问题讨论】:

  • 将它们放在列上不会造成伤害,并且在读取表定义时会产生显式。如果将来您更改主键约束,您仍然会有 NOT NULL 约束。
  • 你确实有两个你不应该有的概念交织在一起。主键不必是自增列,也不必(如果表有)自增列必须是主键。仅仅因为它们倾向于一起使用并不意味着它们是同一个东西。

标签: mysql sql database database-design


【解决方案1】:

(正如您已将问题标记为 mysql。) 在 MySQL 中,您不必明确地这样做。来自the manual

PRIMARY KEY 是一个唯一索引,其中所有键列都必须定义为 NOT NULL。如果它们没有被显式声明为NOT NULL,MySQL 会隐含地(并且默默地)声明它们。

当然,仅仅因为您没有必须并不意味着您可能不想为了清晰等原因。

【讨论】:

  • 它不仅将 PK 列声明为 NOT NULL,如果它们已声明为 NULL,它甚至会覆盖/修改它们为 NOT NULL
【解决方案2】:

是与否 您可以删除“Not null”,但这不会删除约束。就我个人而言,我会把它们留在里面,你把它们拿出来没有任何价值。

【讨论】:

  • 不,你不能。如果列是主键的一部分,则不能将 Not Null 约束更改为 Null。
  • @ypercube 他没有说“更改为 NULL”,他说“删除 NOT NULL”。仅仅因为 NOT NULL 不在 DDL 文本中并不意味着它没有生效。
  • @Branko:如果他的意思是“从定义中删除“不为空”的措辞”,是的,我同意。再读一遍,你是对的,大概就是这个意思。
  • 所以是的,我的意思是我不需要为主键输入 NOT NULL 因为 MySQL 已经添加了 NOT NULL 所以 - id int(11) NOT NULL auto_increment,变成id int(11) auto_increment,
  • 没有可能。无论如何都要输入它,我的意思是它不是那么努力。然后,如果说您想使用其他一些 dbms,或更改主键,您将不会有 doh 时刻。我讨厌简洁作为一种语言选项,因为太聪明的人无法在现实世界中工作,接下来他们会将其缩写为 nN....
【解决方案3】:

主键不得包含可为空的列。 auto_increment 不是检查约束,(它是一个默认约束),因此无论auto_increment 是否存在,都不能从属于主键的列的定义中删除not null。在 mysql 中创建主键表时不必键入not null,因为引擎会自动添加此约束。

【讨论】:

    【解决方案4】:

    我们不需要将列显式声明为非空,因为主键约束使列非空。我已经签入了 Oracle。

    【讨论】:

      猜你喜欢
      • 2010-11-24
      • 2016-04-07
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2017-09-21
      • 2022-12-04
      • 2016-04-19
      • 2021-02-10
      相关资源
      最近更新 更多