一尘不染

带有DEFAULT NULL的MySQL列-风格选择,还是它?

sql

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


阅读 135

收藏
2021-03-10

共1个答案

一尘不染

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

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

columnname type

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

如果您打算在整个系统中保持高度一致,那么我会走自己的路。对于每个表中的每一列,请具有NULL或NOT
NULL。对于所有采用默认值的列,请使用DEFAULT语句。

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

2021-03-10