【问题标题】:SQL remove autonamed constraintsSQL 删除自动命名的约束
【发布时间】:2013-01-03 00:33:06
【问题描述】:

我使用脚本在我的表上创建了一些约束,但没有指定约束名称。结果,我最终遇到了诸如FK__DOC_OBGS___kntr___54E63309 之类的约束。

是否可以在不指定确切的约束名称的情况下删除该约束?

例如,像这样的东西(不起作用)

ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT LIKE 'FK__DOC_OBGS___kntr%'

问题是我们有很多数据库都有这个表,我需要从表中删除所有约束,但显然每个表的名称不同。

【问题讨论】:

  • 这是另一个很好的论据,说明为什么约束应该总是根据您选择的命名约定显式命名...
  • 是的,人们从错误中学习 :))
  • 简单解决方案 => stackoverflow.com/a/49753774/185022

标签: sql sql-server constraints


【解决方案1】:

在使用 Access to SQL Server 升迁工具后,我遇到了类似的问题。在我的情况下,我需要循环所有表以匹配约束,可以这样完成:

DECLARE @sql1 NVARCHAR(MAX);

-- Concatenate all the drop statements in the inner loop into a single SQL string
SELECT @sql1 = STUFF((SELECT '; ' + a.t FROM 
(
    -- find all the constraints we're interested in and create a list of 
    -- SQL statements to drop them
    SELECT 'ALTER TABLE [' + p.name + '] DROP CONSTRAINT [' + o.name + ']' as t
    FROM sys.objects o
    left join sys.objects p on o.parent_object_id = p.object_id 
    WHERE o.name LIKE '%disallow_zero_length' 
) a
FOR XML PATH('')), 1, 2, '')

print @sql1

-- Execute the bit concatenated drop statement
EXEC(@sql1);

您可以在更高版本的 SQL Server 中避免使用STUFF 方法,有关详细信息,请参阅this answer。

【讨论】:

    【解决方案2】:
    DECLARE @sql1 NVARCHAR(MAX);
    SELECT @sql1 = c
    FROM
    (
        SELECT 'ALTER TABLE DOC_INVS_1 DROP CONSTRAINT ' + CONSTRAINT_NAME + '; '
        FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'DOC_INVS_1'
        and CONSTRAINT_NAME LIKE 'FK__DOC_INVS___kntr%' 
    ) T(c);
    
    EXEC(@sql1);
    

    【讨论】:

      【解决方案3】:

      SQL 中的 DDL 命令不与 like 运算符配合。

      但是,您可以使用 information_schema 视图并轻松地为删除约束命令构建 SQL,如下所示:

      SELECT 'ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT ' + CONSTRAINT_NAME
      FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
      WHERE CONSTRAINT_NAME LIKE 'FK__DOC_OBGS___kntr%'
      

      【讨论】:

      • 谢谢。我使用了你的想法,并为我的案例提供了这个解决方案: SELECT 'ALTER TABLE DOC_INVS_1 DROP CONSTRAINT' + CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'DOC_INVS_1' and CONSTRAINT_NAME LIKE 'FK__DOC_INVS___kntr%' 问题是,如何排除脚本返回的查询?我尝试使用 Exec 但我想我必须包含一些括号或其他东西。抱歉,我是 SQL 新手
      • 您使用哪种 DBMS? MS-SQL?
      • 只需将结果行复制并粘贴到查询窗口中,它们一起构成您的 DDL 脚本。使用 F5 运行脚本
      • 我要为所有表执行这个脚本,所以我需要一些 exec 命令
      • 请看我的另一个答案stackoverflow.com/questions/14413573/…。您可以从那里使用想法将“删除约束”脚本累积到单个表中。稍后只需从该表中选择脚本并使用复制粘贴。
      猜你喜欢
      • 2010-10-14
      • 2021-05-29
      • 1970-01-01
      • 1970-01-01
      • 2013-08-22
      • 2014-04-04
      • 1970-01-01
      • 2019-08-17
      相关资源
      最近更新 更多