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

时间:2014-08-12 14:54:20

标签: sql sql-server

即使我正在删除并尝试删除表,我也会收到错误,

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

DROP TABLE [dbo].[Table1]
GO

错误

  

Msg 3726,Level 16,State 1,Line 2无法删除对象'dbo.Table1'   因为它是由FOREIGN KEY约束引用的。

使用SQL Server 2012

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

5 个答案:

答案 0 :(得分:21)

不确定我是否正确理解您要做的事情,很可能Table1在另一个表中被引用为FK。

如果你这样做:

EXEC sp_fkeys 'Table1'

(这取自How can I list all foreign keys referencing a given table in SQL Server?

这将为您提供表格'表1'主键是FK。

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

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

答案 1 :(得分:9)

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

我建议你看看这个堆栈溢出帖子,非常有趣。它被称为:SQL DROP TABLE foreign key constraint

关于如何执行此过程有一个很好的解释。

我会引用回复:

  

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

     

要获取引用表的所有外键关系,可以使用此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')

答案 2 :(得分:3)

您需要删除已添加到的表上的FK,现在可以是Table2,Table3或任何表,它将Table1的列引用为外键。然后你可以放弃Table1。

答案 3 :(得分:3)

您可以使用这些查询查找表格中的所有FK,并在使用表格的表格中查找FK。

Declare @SchemaName VarChar(200) = 'Your Schema name'
Declare @TableName VarChar(200) = 'Your Table Name'

-- Find FK in This table.
SELECT 
    ' IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = 
OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']'
+ ''') AND parent_object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +

    'ALTER TABLE ' +  OBJECT_SCHEMA_NAME(FK.parent_object_id) +
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O 
  ON (O.object_id = FK.parent_object_id )
INNER JOIN SYS.schemas AS S 
  ON (O.schema_id = S.schema_id)  
WHERE 
      O.name = @TableName
      And S.name = @SchemaName


-- Find the FKs in the tables in which this table is used
  SELECT 
    ' IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id =   
      OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + FK.name + ']'
  + ''') AND parent_object_id = OBJECT_ID(N''' + 
      '[' + OBJECT_SCHEMA_NAME(FK.parent_object_id) + '].[' + 
 OBJECT_NAME(FK.parent_object_id) + ']' + ''')) ' +

    ' ALTER TABLE ' +  OBJECT_SCHEMA_NAME(FK.parent_object_id) +
    '.[' + OBJECT_NAME(FK.parent_object_id) + 
    '] DROP CONSTRAINT ' + FK.name
    , S.name , O.name, OBJECT_NAME(FK.parent_object_id)
FROM sys.foreign_keys AS FK
INNER JOIN Sys.objects As O 
  ON (O.object_id = FK.referenced_object_id )
INNER JOIN SYS.schemas AS S 
  ON (O.schema_id = S.schema_id)  
WHERE 
      O.name = @TableName
      And S.name = @SchemaName 

答案 4 :(得分:1)

这是因为您尝试更改的表具有主键(PK),该键在另一个表中的某处被引用为外键(FK)。要知道它是哪个表,请执行以下存储过程:< / p>

EXEC sp_fkeys 'Table_Name'

然后运行drop命令,如下所示:

DROP TABLE Table_Name

注意:'dbo。'是一个默认的系统派生模式,因此您无需在命令中提及如下所示。即使您提到它将起作用的模式,也不必担心。

DROP TABLE dbo.Table_Name

相关问题