如何从SQL Server数据库中删除所有外键?

5
我想要删除所有符合以下条件的外键。
SELECT CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME IN ('Table1', 'Table2')
  AND CONSTRAINT_NAME LIKE '%FK__%__DL%'
2个回答

8

有一个名为INFORMATION_SCHEMA.TABLE_CONSTRAINTS的表,其中存储了所有表的约束条件。 FOREIGN KEY约束类型也保存在该表中。因此,通过筛选此类型,您可以访问所有外键。

SELECT  *
FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE   CONSTRAINT_TYPE = 'FOREIGN KEY'

如果您创建一个动态查询(用于删除外键)来修改表格,您就可以实现修改所有表格的约束目标。
WHILE(EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' AND TABLE_NAME IN ('Table1', 'Table2') AND CONSTRAINT_NAME LIKE '%FK__%__DL%'))
BEGIN
    DECLARE @sql_alterTable_fk NVARCHAR(2000)

    SELECT  TOP 1 @sql_alterTable_fk = ('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM    INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE   CONSTRAINT_TYPE = 'FOREIGN KEY'
            AND TABLE_NAME IN ('Table1', 'Table2')
            AND CONSTRAINT_NAME LIKE '%FK__%__DL%'

    EXEC (@sql_alterTable_fk)
END

EXISTS 函数及其参数用于确保外键至少存在一个约束。


谢谢你的帮助。 如何删除所有外键,其中表名为('Table1','Table2'),约束名称类似于'%FK__%__DL%'? - Elham Azadfar
消息 3728,级别 16,状态 1,行 1 'FK__Stock__DL3__6E0C4425' 不是约束。 消息 3727,级别 16,状态 0,行 1 无法删除约束。请参阅先前的错误。 - Elham Azadfar
执行以下查询语句,您是否能获取到任何记录? SELECT * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME = 'FK__Stock__DL3__6E0C4425' - Siyavash Hamdi
执行以下查询:SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_NAME ='FK__Stock__DL3__6E0C4425'。 然后尝试执行此查询:ALTER TABLE [TABLE_SCHEMA]。[TABLE_NAME] DROP CONSTRAINT [FK__Stock__DL3__6E0C4425]。 是否可以删除?(不要忘记替换TABLE_SCHEMATABLE_NAME的名称! - Siyavash Hamdi

1
与Siyavash所建议的类似,但我更喜欢对过程有更多的控制权。
如果您使用此查询:
SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.[', TABLE_NAME, '] DROP CONSTRAINT [', CONSTRAINT_NAME, ']')
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY' 

运行它,它会为数据库中的每个外键生成一系列drop命令。然后你可以选择要执行的命令,或者添加更多的WHERE子句来进一步限制。

与所有“SQL编写SQL”一样,你需要将结果从网格中复制出来,粘贴到SSMS的新窗口中并运行它们(F5)。

因此,你的查询语句使用CONCAT编写了drop命令:

SELECT CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.[', TABLE_NAME, '] DROP CONSTRAINT [', CONSTRAINT_NAME, ']')
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE TABLE_NAME IN ('Table1', 'Table2')
  AND CONSTRAINT_NAME LIKE '%FK__%__DL%'

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