在许多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那样区分这些情况。如果我做错了,如果我错了,请纠正我。
答案 0 :(得分:21)
如果列可以将
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
使用哪种选择是在显性和简洁之间取得平衡。根据具体情况,我可能会使用上述任何一种。
答案 1 :(得分:11)
我遇到的每个数据库都会以您描述的方式处理NULL。当列接受NULL值时,则不在INSERT上提供值时将该值默认为NULL。我相信这是ANSI标准行为的一部分。
至于指定“NULL”本身。这是一个偏好问题。该标准确实表示列允许NULL ,除非指定了 NOT NULL(在数据定义语言的级别)。因此,NULL本身是不必要的,并且您有第四个等效选项:
columnname type
通过ANSI标准将NULL嵌入到SQL语言中。你的第三个选择是最明确的,但它看起来也有点不寻常。
如果您计划在整个系统中保持超级一致,那么我会采取您所在的路径。对于每个表中的每个列都有NULL或NOT NULL。对于采用默认值的所有列,请使用DEFAULT语句。
但是,不要指望与您合作的其他人(现在或将来)能够轻松地遵循此示例。在这种情况下,许多人更喜欢第四种选择,因为它需要更少的输入,并且是所有(或几乎所有)SQL方言的行为。