使用生成的名称添加 DEFAULT 约束

Posted

技术标签:

【中文标题】使用生成的名称添加 DEFAULT 约束【英文标题】:Add DEFAULT constraint with a generated name 【发布时间】:2016-05-07 07:49:39 【问题描述】:

在 SQL Server 中,我有一个现有的表。现在我想为其中一列添加一个 DEFAULT 约束 - 无需为其定义名称

-- generated name works fine when creating new column
ALTER TABLE [xyz]
ADD [newColumn] int NOT NULL DEFAULT 0

-- when adding a default value afterwards I seem to have to provide a name
ALTER TABLE [xyz]
ADD CONSTRAINT [iDontWantToPutANameHere] DEFAULT 0 FOR [existingColumn]

【问题讨论】:

当您像在第一个示例中所做的那样添加约束时,sql server 将自行为该约束生成一个名称。它生成的名称对人类不友好。关键是每个约束都必须有一个名称。您可以更改该列以避免命名您的约束。但是,我建议您应该命名您的约束。明确地使用你的 sql 对象从来都不是一件坏事。 这听起来是一种很好的方式,可以在未来为自己添加更多工作。当您知道它的名称时删除约束?琐碎的。当您让系统生成名称时删除它 - 嗯,首先您必须找到它(并确保您找到了正确的名称),然后您必须生成动态 SQL 以实际执行删除操作。可爱的。 "明确地使用你的 sql 对象从来都不是一件坏事。"不对!在 ETL 环境中,您可能希望保留表的 _prev 版本。如果你的表有约束并且你命名它们,那么你必须重命名 _prev 表上的约束,然后才能在新表上再次创建它们。这很麻烦,但在我们的系统上,它已成为一个关键问题,因为其他重要进程会由于旧表上需要排他锁来重命名约束而定期失败。解决方案?不要显式命名约束,那么你根本不需要接触活动表。 【参考方案1】:

您可以为现有列创建默认约束,而无需指定其名称,例如:

create table test
(
    existing_column int
)

alter table test
    add default 0 for existing_column

但是,有很多文章,建议最好明确命名约束。因为它更难删除或以其他方式更改系统命名的约束。此外,如果您有同一个数据库的多个实例,则它们之间的默认名称将不同。

【讨论】:

是的,它适用于 MSSQL 2019(很可能是之前的几个版本),并且可以正确生成默认约束名称。唯一的区别是,如果您使用这样的约束为表编写脚本,那么它仍然会出现alter table test add default 0 for existing_column 而不是create table test (existing_column int default (0))。如果您需要使用一些自动化工具(例如 SSDT)来执行架构比较,这将是一个问题。【参考方案2】:

可以肯定,向现有列添加默认约束的唯一方法是命名。

如果获取系统生成的名称对您来说很重要,您可以这样做:

    Alter Table 添加具有未命名的 DEFAULT 值的新列。 更新表,将新列的值设置为旧列的值。 删除旧列。 将新列重命名为旧列的名称。

我个人希望 SQL Server 没有提供任何不命名约束的选项。我讨厌处理一些懒惰的开发人员留下的系统生成名称。

【讨论】:

以上是关于使用生成的名称添加 DEFAULT 约束的主要内容,如果未能解决你的问题,请参考以下文章

sql server 2000 如何改变 default属性

添加默认约束的命令

添加默认约束的命令

在 sql 级别添加约束以复制列

我可以在 MySQL 中使用具有多个值的 DEFAULT 约束吗?我可以在下面的示例中添加更多默认值吗? [关闭]

SQL DEFAULT 约束:使用方法及撤销方法解析