数据库
首页 > 数据库> > 带有DEFAULT NULL的MySQL列 – 样式选择,还是它?

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

作者:互联网

在许多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那样区分这些情况.如果我做了任何不正确的假设,如果我错了,请纠正我.

解决方法:

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

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

columnname type

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

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

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

标签:sql,mysql,postgresql,database-migration,sql-scripts
来源: https://codeday.me/bug/20191001/1839614.html