在许多类型的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
NULL通过ANSI标准完全嵌入到SQL语言中。您的第三个选项是最明确的,但它看起来也有点不寻常。
如果您打算在整个系统中保持高度一致,那么我会走自己的路。对于每个表中的每一列,请具有NULL或NOT NULL。对于所有采用默认值的列,请使用DEFAULT语句。
但是,不要指望与您一起工作的其他人(现在或将来)会很容易地遵循此示例。在这种情况下,许多人更喜欢第四个选项,因为它只需要较少的输入,并且是所有(或几乎所有)SQL语言的行为方式。