27

在许多 SQL 风格中,您可以通过三种方式在每次插入行时将列隐式设置为 NULL。这些都是:

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

即第一个设置 NULL 标志(与 NOT NULL 相对),第二个将 NULL 标志保留为默认值,第三个设置 NULL 标志并将隐式值设置为 NULL。

我听说在 Microsoft SQL 中,第二个变体并不完全相同,因为您还可以为表或模式自定义 NULL 标志的默认值。

但是对于 MySQL,我不相信有这样的功能。此外,在 MySQL 中,与 NOT NULL 列不同,带有 NULL 标志的列在没有显式值的情况下总是在插入时隐式设置为 NULL,即使打开了严格模式也是如此。因此,所有这些列声明都是相同的。

在我的 MySQL 脚本中,对于每个 NOT NULL 列,我为我不希望在我的应用程序的某些插入中设置的列指定一个 DEFAULT 值,以避免在启用严格模式时出现任何问题。因此,我觉得如果我选择第三种变体会更加对称,即使它是最冗长和明确的。像第三个变体这样的声明是常见的,还是第一个或第二个变体更频繁地出现在其他人的脚本中?

我正在考虑倾向于第二种方法,因为这是 MySQL 转储使用的别名,但我不确定这是一个好主意,因为它还在列声明的默认子句中将整数文字转储为字符串(单引号)。

这个问题似乎比有解决方案的问题更具意见,但我也想知道我不知道的任何潜在问题。将来我可能会选择从 MySQL 迁移到 PostgreSQL,我也可以参考那些专家的一些建议,例如,如果 PostgreSQL 能像 MS-SQL 那样区分这些情况。如果我做了任何不正确的假设,请纠正我。

4

2 回答 2

30

数据类型默认值下所述:

如果列可以NULL作为值,则使用显式DEFAULT NULL子句定义该列。

(我认为他们的意思是隐式的,而不是显式的)。

此外,如CREATE TABLE语法中所述:

如果既未指定NULL也未NOT NULL指定,则将该列视为NULL已指定。

因此,在 MySQL 中,以下列定义都是相同的:

columnname type
columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

选择使用哪个是明确和简洁之间的平衡。根据情况,我可能会使用上述任何一种。

于 2012-09-03T20:21:20.763 回答
16

我遇到的每个数据库都按照您描述它们的方式处理 NULL。当列接受 NULL 值时,如果在 INSERT 上不提供值,则默认值为 NULL。我相信这是 ANSI 标准行为的一部分。

至于指定“NULL”本身。这是一个偏好问题。该标准确实说,除非指定 NOT NULL(在数据定义语言级别),否则列允许 NULL。因此,NULL 本身是不必要的,您还有第四个等效选项:

columnname type

NULL 通过 ANSI 标准完全嵌入在 SQL 语言中。您的第三个选项是最明确的,但它看起来也有点不寻常。

如果您计划在整个系统中保持超级一致,那么我会选择您正在走的路。对于每个表中的每一列都有 NULL 或 NOT NULL。对于所有采用默认值的列,请使用 DEFAULT 语句。

但是,不要指望与您一起工作的其他人(现在或将来)很容易效仿这个例子。在这种情况下,许多人更喜欢第四个选项,因为它需要更少的输入,并且是所有(或几乎所有)SQL 方言的行为方式。

于 2012-09-03T20:21:34.877 回答