【问题标题】:Drop constraint on a column without knowing constraint name在不知道约束名称的情况下删除列上的约束
【发布时间】:2019-07-04 09:04:01
【问题描述】:

我想在多个数据库中的列上删除一个约束。我不知道列上约束的确切名称。

是否可以在不知道其名称的情况下删除约束。

例如: ALTER TABLE TempTable DROP CONSTRAINT IF EXISTS ON Columnname

【问题讨论】:

  • 在创建约束时明确命名约束是个好主意,这样您就可以为将来的更改命名。如果您有多个拥有自己的数据库的客户端,这一点尤其重要,这样您就可以使用相同的脚本自动更改。

标签: sql-server sql-server-2012 sql-server-2008-r2


【解决方案1】:

您可以从这样的表中检索约束信息

select t.Name as TableName,
       ccd.Name as ColumnName_default_constraint,
       dc.Name as default_constraint,
       ccc.Name as ColumnName_check_constraint,
       cc.Name as check_constraint
from   sys.tables t
  inner join sys.default_constraints dc on t.object_id = dc.parent_object_id
  inner join sys.check_constraints cc on t.object_id = cc.parent_object_id
  inner join sys.columns ccd on dc.parent_object_id = ccd.object_id 
                          and ccd.column_id = dc.parent_column_id
  inner join sys.columns ccc on cc.parent_object_id = ccc.object_id 
                          and ccc.column_id = cc.parent_column_id
where t.Name = 'your table name'
order by t.Name

从这里你可以构建这样的脚本

select 'alter table ' + t.Name +' drop constraint ' + dc.Name,
       'alter table ' + t.Name +' drop constraint ' + cc.Name
from   sys.tables t
  inner join sys.default_constraints dc on t.object_id = dc.parent_object_id
  inner join sys.check_constraints cc on t.object_id = cc.parent_object_id
where t.Name = 'your table name'
order by t.Name

【讨论】:

  • 我编辑了我的答案,第一个版本只显示默认约束,现在也会显示检查约束
  • 表可能有很多约束,我想获取特定列的约束名称。
  • @Ask_SO 我编辑了我的答案,第一个查询现在也将显示约束所在的列名
猜你喜欢
  • 2011-04-26
  • 2023-03-10
  • 2012-02-18
  • 2010-11-28
  • 2015-03-22
  • 1970-01-01
  • 2021-08-18
  • 2011-02-02
  • 2012-09-05
相关资源
最近更新 更多