MySQL列具有默认的null - 样式选择,或者是它?

Kev*_*Jin 20 mysql sql postgresql database-migration sql-scripts

在许多SQL版本中,有三种方法可以在每次插入行时将列隐式设置为NULL.这些是

columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)

即第一个设置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.如果我做了任何不正确的假设,如果我错了,请纠正我.

egg*_*yal 21

数据类型默认值所述:

如果列可以NULL作为值,则使用explicit DEFAULT NULL子句定义该列.

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

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

如果既未指定也NULLNOT NULL指定,则将列视为NULL已指定.

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

columnname type
columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL
Run Code Online (Sandbox Code Playgroud)

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

  • 请注意,有一个带有"TIMESTAMP"类型的边缘情况.如果您的列被声明为`stamp TIMESTAMP`,并且您执行INSERT而没有指定`stamp`的值,则它将默认使用当前UTC日期时间的值进行INSERTing.如果将列声明为`stamp TIMESTAMP NULL`,则INSERT将默认为NULL. (4认同)

Gor*_*off 11

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

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

columnname type
Run Code Online (Sandbox Code Playgroud)

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

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

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