在许多 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 中,与 NOT NULL 列不同,带有 NULL 标志的列在没有显式值的情况下总是在插入时隐式设置为 NULL,即使打开了严格模式也是如此。因此,所有这些列声明都是相同的。
在我的 MySQL 脚本中,对于每个 NOT NULL 列,我为我不希望在我的应用程序的某些插入中设置的列指定一个 DEFAULT 值,以避免在启用严格模式时出现任何问题。因此,我觉得如果我选择第三种变体会更加对称,即使它是最冗长和明确的。像第三个变体这样的声明是常见的,还是第一个或第二个变体更频繁地出现在其他人的脚本中?
我正在考虑倾向于第二种方法,因为这是 MySQL 转储使用的别名,但我不确定这是一个好主意,因为它还在列声明的默认子句中将整数文字转储为字符串(单引号)。
这个问题似乎比有解决方案的问题更具意见,但我也想知道我不知道的任何潜在问题。将来我可能会选择从 MySQL 迁移到 PostgreSQL,我也可以参考那些专家的一些建议,例如,如果 PostgreSQL 能像 MS-SQL 那样区分这些情况。如果我做了任何不正确的假设,请纠正我。