为什么SQL Server不断创建DF约束?
问题描述:
我想在SQL中创建升级和退出脚本。升级脚本添加一列,像这样:为什么SQL Server不断创建DF约束?
IF NOT EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
ADD ColumnName bit NOT NULL DEFAULT(0)
回退脚本删除像这样的列:
IF EXISTS (SELECT * FROM sys.columns WHERE Name = N'ColumnName'
AND object_id = OBJECT_ID(N'[dbo].[TableName]'))
ALTER TABLE TableName
DROP COLUMN ColumnName
然而,回退脚本引发此错误:
Msg 5074, Level 16, State 1, Line 5
The object 'DF__TableName__ColumnName__1BF3D5BD' is dependent on column 'ColumnName'.
Msg 4922, Level 16, State 9, Line 5
ALTER TABLE DROP COLUMN ColumnName failed because one or more objects access this column.
我知道如何删除约束,但约束的名称每次都会更改(后缀更改)。我需要SQL Server停止创建这个随机命名的约束,或者我需要能够使用通配符删除脚本中的约束,因为名称会更改。
答
这是default
约束,因为新添加的列中的DEFAULT(0)
而被添加。
你可以自己命名,所以它有一个已知的固定名称,而不是依靠自动生成名称。
ALTER TABLE TableName
ADD ColumnName bit NOT NULL CONSTRAINT DF_Some_Fixed_Name DEFAULT(0)
然后删除列和约束在一起
ALTER TABLE dbo.TableName
DROP CONSTRAINT DF_Some_Fixed_Name, COLUMN ColumnName
答
运行以下命令:
declare @name as nvarchar(255);
SELECT @name = name FROM dbo.sysobjects
WHERE name like 'DF__XXX__YYY__%' and type = 'D'
IF @name is not null BEGIN
EXEC('ALTER TABLE XXX] DROP CONSTRAINT ' + @name);
END
+1,通常建议明确命名的约束。 –
谢谢马丁。此外,要正确检查约束是否存在(在删除之前),我使用了描述的方法** [here](http://stackoverflow.com/questions/2499332/how-to-check-if-a-constraint- exists-in-sql-server/6839547#6839547)** – WEFX
@ÁlvaroG.Vicario - 是的。马丁的回答给了你一个例子。 –