【发布时间】:2010-01-07 07:22:19
【问题描述】:
除了主键/外键字段之外,是否有理由支持或反对在 mysql 表中将某些字段设置为 NULL 或 NOT NULL?
【问题讨论】:
-
您的意思是为什么要将某些列设置为 NOT NULL?
-
是的,为不准确的语言道歉,仍然了解这一切
标签: mysql database-design data-modeling
除了主键/外键字段之外,是否有理由支持或反对在 mysql 表中将某些字段设置为 NULL 或 NOT NULL?
【问题讨论】:
标签: mysql database-design data-modeling
说实话,这完全取决于您的域名。从功能上讲,它对数据库引擎几乎没有影响,但如果您希望拥有一个定义良好的域,通常最好让数据库和应用程序层都反映您对用户的要求。
如果用户是否输入他们的“显示名称”对您来说没有意义,那么请务必将该列标记为可为空。另一方面,如果您需要“显示名称”,则应在数据库中将其标记为非空,并在应用程序中强制执行约束。通过将约束加倍,您可以确保如果您的前端发生更改,该域仍然是完全合格的。
【讨论】:
MySQL 在字段上有一个NOT NULL 条件,但这不会阻止您插入“空”数据。无法将字段标记为“必填”。
正如 Pekka 所说,您应该在应用程序的更高级别上进行某种验证以防止这种情况发生。
【讨论】:
这不是 MySQL 特定的东西 - 我知道的每个数据库都允许定义具有约束的列,该约束要么允许在列中使用 NULL 值,要么不允许这种情况发生。
将列定义为NOT NULL 意味着必须始终存在与数据类型匹配的值。 NULL 是一个标记值,它的数据类型超越了为该列定义的任何内容。
如果列是外键,则在将值插入当前表之前该值也必须已经存在于相关表中。 DEFAULT 约束在定义为 NOT NULL 的列上很常见,但不是必需的,因此如果尝试将 NULL 插入这些列,这些列将填充适当的值。回到外键,外键列可以为空,这意味着关系是可选的 - 业务规则允许没有关系。
理想情况下,每一列都应该是NOT NULL,但这实际上取决于业务规则的要求。
【讨论】:
我不知道你会如何在 mySQL 中定义一个必填字段,请赐教?我真的不知道。
无论如何,即使可以做到这一点,我也很难想到一个有意义的场景。 IMO,您必须更早地验证错误(=错误地为空)数据。验证、卫生和切割应该在任何东西进入数据库之前很久就完成。数据库错误应该发生的唯一时间是发生异常情况时,例如当数据库在物理上无法访问时。
【讨论】: