删除SQL中列的默认约束

时间:2012-05-27 21:16:23

标签: sql sql-server database tsql

我有一个表格,其中包含目前正在使用的列:

name NVARCHAR(128) NOT NULL DEFAULT ''

我正在改变这样的列,使其可以为空:

ALTER TABLE  mytable ALTER COLUMN name NVARCHAR(128) NULL

但是,在表的一个实例中名为“DF__mytable__datab__7DE4B36”的默认约束仍然存在。我知道如果原作者命名约束,就可以避免这种情况。我有几个这些表的实例,但我不想手动删除每个表中的每个约束。在Sql Server中的一个列上删除这个默认约束的最简单,最优雅的方法是什么,我可以统一地应用于该表的每个实例?

修改

这是我最终使用的脚本:

DECLARE @table_id AS INT
DECLARE @name_column_id AS INT
DECLARE @sql nvarchar(255) 

-- Find table id
SET @table_id = OBJECT_ID('mytable')

-- Find name column id
SELECT @name_column_id = column_id
FROM sys.columns
WHERE object_id = @table_id
AND name = 'name'

-- Remove default constraint from name column
SELECT @sql = 'ALTER TABLE mytable DROP CONSTRAINT ' + D.name
FROM sys.default_constraints AS D
WHERE D.parent_object_id = @table_id
AND D.parent_column_id = @name_column_id
EXECUTE sp_executesql @sql

可以在此处找到可用于实现此目的的另一个脚本: How to drop SQL default constraint without knowing its name?

谢谢!

3 个答案:

答案 0 :(得分:54)

这是你放弃约束的方法

ALTER TABLE <schema_name, sysname, dbo>.<table_name, sysname, table_name>
   DROP CONSTRAINT <default_constraint_name, sysname, default_constraint_name>
GO

使用脚本

-- t-sql scriptlet to drop all constraints on a table
DECLARE @database nvarchar(50)
DECLARE @table nvarchar(50)

set @database = 'dotnetnuke'
set @table = 'tabs'

DECLARE @sql nvarchar(255)
WHILE EXISTS(select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where constraint_catalog = @database and table_name = @table)
BEGIN
    select    @sql = 'ALTER TABLE ' + @table + ' DROP CONSTRAINT ' + CONSTRAINT_NAME 
    from    INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
    where    constraint_catalog = @database and 
            table_name = @table
    exec    sp_executesql @sql
END

积分归Jon Galloway所有 http://weblogs.asp.net/jgalloway/archive/2006/04/12/442616.aspx

答案 1 :(得分:2)

我建议:

DECLARE @sqlStatement nvarchar(MAX),
        @tableName nvarchar(50) = 'TripEvent',
        @columnName nvarchar(50) = 'CreatedDate';

SELECT                  @sqlStatement = 'ALTER TABLE ' + @tableName + ' DROP CONSTRAINT ' + dc.name + ';'
        FROM            sys.default_constraints AS dc
            LEFT JOIN   sys.columns AS sc
                ON      (dc.parent_column_id = sc.column_id)
        WHERE           dc.parent_object_id = OBJECT_ID(@tableName)
        AND         type_desc = 'DEFAULT_CONSTRAINT'
        AND         sc.name = @columnName
PRINT'   ['+@tableName+']:'+@@SERVERNAME+'.'+DB_NAME()+'@'+CONVERT(VarChar, GETDATE(), 127)+';  '+@sqlStatement;
IF(LEN(@sqlStatement)>0)EXEC sp_executesql @sqlStatement

答案 2 :(得分:1)

我想提一个上一个问题,因为我遇到了同样的问题,并由solution解决了。 首先,约束总是在其名称中使用Hash值构建。所以问题是HASH在不同的机器或数据库中有所不同。例如DF__Companies__IsGlo__6AB17FE4此处6AB17FE4是哈希值(8位)。所以我指的是一个对所有

都富有成效的单一剧本
DECLARE @Command NVARCHAR(MAX)
     declare @table_name nvarchar(256)
     declare @col_name nvarchar(256)
     set @table_name = N'ProcedureAlerts'
     set @col_name = N'EmailSent'

     select @Command ='Alter Table dbo.ProcedureAlerts Drop Constraint [' + ( select d.name
     from 
         sys.tables t
         join sys.default_constraints d on d.parent_object_id = t.object_id
         join sys.columns c on c.object_id = t.object_id
                               and c.column_id = d.parent_column_id
     where 
         t.name = @table_name
         and c.name = @col_name) + ']'

    --print @Command
    exec sp_executesql @Command

它将删除您的默认约束。但是,如果你想再次创建它,你可以试试这个

ALTER TABLE [dbo].[ProcedureAlerts] ADD DEFAULT((0)) FOR [EmailSent]

最后,只需运行DROP命令即可​​删除该列。