带有 DEFAULT NULL 的 MySQL 列 - 文体选择,还是?

标签 mysql sql postgresql database-migration sql-scripts

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

最佳答案

Data Type Default Values 中所述:

If the column can take NULL as a value, the column is defined with an explicit DEFAULT NULL clause.

(我认为他们的意思是隐式,而不是显式)。

此外,如 CREATE TABLE Syntax 中所述:

If neither NULL nor NOT NULL is specified, the column is treated as though NULL had been specified.

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

columnname type
columnname type NULL
columnname type DEFAULT NULL
columnname type NULL DEFAULT NULL

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

关于带有 DEFAULT NULL 的 MySQL 列 - 文体选择,还是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12253415/

相关文章:

mysql - 是否有时联结表会增加不必要的复杂性?

sql - PostgreSQL 中 "when"处或附近的语法错误

sql - 是否可以在不释放行锁的情况下提交一个事务并启动一个新事务?

mysql - sql查询连接四张表

MySQL 剥离非数字字符进行比较

sql - 将查询从 MS Access 转换为 SQL Server

c# - 从 winforms 应用程序到 Azure SQL 的安全连接字符串

sql - 用于更新下游源的数据库模式?

php - 将预构建的 Laravel 站点安装到本地 MAMP 服务器上

mysql - 将 EAV 数据视为 3NF 的 SQL 查询? (Drupal 6 配置文件值)