【问题标题】:Drop default constraint on a column in TSQL删除 SQL 中列的默认约束
【发布时间】:2012-06-02 09:21:48
【问题描述】:

我有一个表,其中包含这样的列,目前处于活动状态:

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?

谢谢!

【问题讨论】:

标签: sql sql-server database tsql


【解决方案1】:

这就是你要放弃约束的方式

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

【讨论】:

  • 稍微修改了我的问题。我实际上正在寻找一种方法来做到这一点,而不知道我拥有的每个表的约束名称
  • 我添加了一个脚本,该脚本删除了 db/table 的约束
  • 我还没有尝试过,但如果我想删除列而不是表的所有默认约束,同样的工作。今晚我会尝试修改脚本,看看是否可以。
  • 很遗憾,“INFORMATION_SCHEMA.TABLE_CONSTRAINTS”没有默认约束的元数据。
  • 我最终在您的回答中使用了 sp_executesql proc 来完成工作。查看我对我使用的脚本的编辑。
【解决方案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

【讨论】:

    【解决方案3】:

    我想参考以前的问题,因为我遇到了同样的问题并通过这个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 命令即可删除该列。

    【讨论】:

    • 为什么不这样添加它:ALTER TABLE [dbo].[ProcedureAlerts] ADD CONSTRAINT [DF_ProcedureAlerts_EmailSent] DEFAULT ((0)) FOR [EmailSent] 这样它会被命名并且下次更容易删除
    猜你喜欢
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多