无法删除对象'dbo.Table1',因为它是由FOREIGN KEY约束引用的

Mat*_*ics 9 sql sql-server

即使我正在删除并试图删除表,我得到错误,

ALTER TABLE [dbo].[Table1] DROP CONSTRAINT [FK_Table1_Table2]
GO

DROP TABLE [dbo].[Table1]
GO
Run Code Online (Sandbox Code Playgroud)

错误

消息3726,级别16,状态1,行2无法删除对象'dbo.Table1',因为它由FOREIGN KEY约束引用.

使用SQL Server 2012

我使用sql server 2012生成了脚本,所以sQL服务器给了我错误的脚本吗?

rjs*_*jso 25

不确定我是否正确理解你想要做什么,很可能Table1在另一个表中被引用为FK.

如果你这样做:

EXEC sp_fkeys 'Table1'
Run Code Online (Sandbox Code Playgroud)

(这取自我如何列出引用SQL Server中给定表的所有外键?)

这将为您提供"Table1"主键为FK的所有表.

删除表中存在的约束,这不是删除表本身的必要步骤.删除引用'Table1'的每个可能的FK是.

至于问题的第二部分,SQL Server自动脚本在很多方面都是盲目的.很可能是阻止您删除Table1的表被删除或者根本没有被脚本更改.RedGate有一些工具可以帮助那些级联删除(通常在你试图删除一堆表时),但它不是防弹的,而且相当昂贵.http://www.red-gate.com/products/sql-development/sql-toolbelt/


Orl*_*era 11

首先,你需要放弃你的FK.

我建议你看看这个堆栈溢出帖子,非常有趣.它被称为:SQL DROP TABLE外键约束

有关如何执行此过程的良好解释.

我会引用一个回复:

.....如果确实存在引用它的外键,则不会丢弃您的表.

要获取引用表的所有外键关系,可以使用此SQL(如果您使用的是SQL Server 2005及更高版本):

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')


SELECT 
'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(parent_object_id) +
'.[' + OBJECT_NAME(parent_object_id) + 
'] DROP CONSTRAINT ' + name
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')
Run Code Online (Sandbox Code Playgroud)