如何生成完整数据库脚本:重复执行生成脚本报默认值绑定错误咨询
问题解答
报错具体含义
"Column already has a DEFAULT bound to it"(错误号1781)的核心含义是:同一个表的同一个列只能绑定一个DEFAULT默认值约束,当前你操作的
[cfg].[LookupColumns].[IsPrimaryKey]列已经存在DEFAULT约束,重复添加的操作会被SQL Server直接拒绝,后续的约束创建失败报错(1750)是该问题的连锁反应。
操作错误点
- 第一版带存在性判断的脚本逻辑缺陷:你只判断了名为
DF__LookupCol__IsPri__46DD686B的DEFAULT约束是否存在,没有校验目标列是否有其他名称的DEFAULT约束。如果该列之前通过其他脚本、手动操作添加过其他命名/未命名的DEFAULT约束,你的存在性判断会直接绕过,但实际添加操作依然会触发报错。 - 第二版显式指定约束名的脚本逻辑缺陷:完全没有加存在性判断逻辑,只要目标列已经有任意DEFAULT约束,直接执行该语句必然触发1781报错。
可重复执行的正确脚本
方案1:仅当列无DEFAULT约束时添加(推荐普通场景使用)
该逻辑直接校验目标列是否已有DEFAULT约束,不受约束名变化影响:
IF NOT EXISTS ( SELECT 1 FROM sys.default_constraints dc INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id INNER JOIN sys.tables t ON c.object_id = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = 'cfg' AND t.name = 'LookupColumns' AND c.name = 'IsPrimaryKey' ) BEGIN ALTER TABLE [cfg].[LookupColumns] ADD CONSTRAINT [DF_LookupColumns_IsPrimaryKey] DEFAULT (CONVERT([bit],(0))) FOR [IsPrimaryKey] END GO
方案2:强制覆盖已有DEFAULT约束(适合需要统一约束名的运维场景)
先删除列上已有的任意DEFAULT约束,再添加指定规则的约束:
DECLARE @ExistingDefConstraint NVARCHAR(128) SELECT @ExistingDefConstraint = dc.name FROM sys.default_constraints dc INNER JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id INNER JOIN sys.tables t ON c.object_id = t.object_id INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = 'cfg' AND t.name = 'LookupColumns' AND c.name = 'IsPrimaryKey' IF @ExistingDefConstraint IS NOT NULL BEGIN EXEC('ALTER TABLE [cfg].[LookupColumns] DROP CONSTRAINT [' + @ExistingDefConstraint + ']') END GO ALTER TABLE [cfg].[LookupColumns] ADD CONSTRAINT [DF_LookupColumns_IsPrimaryKey] DEFAULT (CONVERT([bit],(0))) FOR [IsPrimaryKey] GO
内容的提问来源于stack exchange,提问作者Alex Gordon
相关产品推荐
相关产品推荐

