带有DEFAULT NULL的MySQL列 - 样式选择,还是它?

问题描述 投票:20回答:2

在许多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中,具有NULL标志的列(与NOT NULL列不同),如果没有显式值,则在插入时始终隐式设置为NULL,即使打开严格模式也是如此。这样就使所有这些列声明都相同。

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

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

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

mysql sql postgresql database-migration sql-scripts
2个回答
11
投票

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

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

columnname type

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

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

但是,不要指望与您合作的其他人(现在或将来)能够轻松地遵循此示例。在这种情况下,许多人更喜欢第四种选择,因为它需要更少的输入,并且是所有(或几乎所有)SQL方言的行为。


21
投票

Data Type Default Values所述:

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

(我认为他们的意思是隐含的,而不是明确的)。

此外,正如CREATE TABLE Syntax所述:

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.