如何在没有删除子表的情况下删除具有约束的表?

时间:2013-02-20 06:22:23

标签: sql-server sql-server-2008 foreign-key-relationship

我有60个表,我想要删除这些表中的10个。但是在删除这10个时,它显示出FK约束错误。有没有办法DROP这些表而不通过禁用约束来删除其他表?

我也截断了引用表中的所有数据,仍显示FK约束错误。

我的目标是DROP一个表而不删除其他表FK到这些表。

1 个答案:

答案 0 :(得分:4)

使用此SQL语句,您可以列出引用给定表的所有FK约束 - 我还提供SQL命令以删除引用您的FK约束 表:

DECLARE @TableName SYSNAME
SET @TableName = 'dbo.YourTableNameHere'

;WITH ReferencingFK AS 
(
    SELECT 
        fk.Name AS 'FKName',
        OBJECT_NAME(fk.parent_object_id) 'ParentTable',
        cpa.name 'ParentColumnName',
        OBJECT_NAME(fk.referenced_object_id) 'ReferencedTable',
        cref.name 'ReferencedColumnName'
    FROM 
        sys.foreign_keys fk
    INNER JOIN 
        sys.foreign_key_columns fkc ON fkc.constraint_object_id = fk.object_id
    INNER JOIN 
        sys.columns cpa ON fkc.parent_object_id = cpa.object_id AND fkc.parent_column_id = cpa.column_id
    INNER JOIN 
        sys.columns cref ON fkc.referenced_object_id = cref.object_id AND fkc.referenced_column_id = cref.column_id
)
SELECT 
    FKName,
    ParentTable,
    ParentColumnName,
    ReferencedTable,
    ReferencedColumnName,
    DropCmd = 'ALTER TABLE dbo.' + ParentTable + ' DROP CONSTRAINT [' + FKName + ']'
FROM 
    ReferencingFK
WHERE
    ReferencedTable = @TableName
ORDER BY 
    ParentTable, ReferencedTable, FKName

因此,要放入要放入@TableName变量的10个表中的一个表中并运行它。您应该得到一个输出,显示引用该表的所有FK约束,包括一个具有ALTER TABLE .... DROP CONSTRAINT ....命令的列,以删除该约束(约束!不是另一个表)系统