SQL删除自动命名约束

13

我在没有指定约束名称的情况下,使用脚本在我的表上创建了一些约束。因此,我最终得到像FK__DOC_OBGS___kntr___54E63309这样的约束。

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

例如,类似于以下内容(不起作用的示例):

ALTER TABLE DOC_OBGS_10 DROP CONSTRAINT LIKE 'FK__DOC_OBGS___kntr%'

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


1
这是另一个很好的理由,为什么约束应该始终根据您选择的命名约定明确命名... - marc_s
2
是的,人们通过犯错误来学习:)) - Dimitar Tsonev
简单解决方案 => https://stackoverflow.com/a/49753774/185022 - AZ_
3个回答

10
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);

6

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的新手。 - Dimitar Tsonev
你使用哪个数据库管理系统?MS-SQL吗? - pkmiec
只需将形成DDL脚本的结果行复制并粘贴到查询窗口中。使用F5运行脚本。 - pkmiec
我将对所有表执行此脚本,因此我需要使用exec命令的某些内容。 - Dimitar Tsonev
请查看我的另一个答案https://dev59.com/cG3Xa4cB1Zd3GeqPeWgk#14413819。您可以从那里的想法中累积“删除约束”脚本到单个表中。稍后只需从该表中选择脚本并使用复制粘贴即可。 - pkmiec
谢谢帮忙。我已经弄清楚如何执行该命令了。 - Dimitar Tsonev

0

在使用Access到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了解更多信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接