Sql server 使用生成的名称添加默认约束

Sql server 使用生成的名称添加默认约束,sql-server,tsql,constraints,default-value,Sql Server,Tsql,Constraints,Default Value,在SQL Server中,我有一个现有表。现在,我想向其中一列添加一个默认约束-,而无需为其定义名称 -- 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

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

-- 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]

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

如果获取系统生成的名称对您非常重要,您可以执行以下操作:

  • Alter Table使用未命名的默认值添加新列
  • 更新表,将新列的值设置为旧列的值
  • 删除旧列
  • 将新列重命名为旧列的名称
    就我个人而言,我希望SQL Server不要为不命名约束提供任何选项。我讨厌处理一些懒惰的开发人员留下的系统生成的名称。

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

    create table test
    (
        existing_column int
    )
    
    alter table test
        add default 0 for existing_column
    

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

    当您像在第一个示例中那样添加约束时,sql server将自行为该约束生成一个名称。它产生的名字对人类不友好。关键是每个约束都必须有一个名称。可以更改列以避免命名约束。但是,我建议您命名您的约束。对sql对象进行显式处理从来都不是一件坏事。这听起来是将来为自己添加更多工作的好方法。当您知道约束的名称时,是否删除该约束?琐碎的。当您让系统生成名称时删除它—首先您必须找到它(并确保找到正确的名称),然后您必须生成动态SQL来实际执行删除操作。可爱。“用sql对象显式表示从来都不是一件坏事。”不是真的!在ETL环境中,您可能希望保留表的_prev版本。如果您的表中有约束并对其进行了命名,则必须重命名_prev表中的约束,然后才能在新表中再次创建它们。这很麻烦,但在我们的系统上,这已成为一个关键问题,因为其他重要进程由于旧表上重命名约束所需的独占锁而定期失败。解决方案是什么?不显式命名约束,则根本不需要接触活动表。是的,它在MSSQL 2019中工作(很可能以前有几个版本),并正确生成默认约束名称。唯一的区别是,如果您使用这样一个约束为表编写脚本,那么它仍然会为现有的_列生成
    创建表测试(现有的_列int default(0))
    。如果您需要使用一些自动化工具(如SSDT)来执行模式比较,这将是一个问题。