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

问题描述 投票:0回答:7

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

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

DROP TABLE [dbo].[Table1]
GO

错误

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

使用 SQL Server 2012

我使用sql server 2012生成脚本,那么sql server给了我错误的脚本吗?

sql sql-server
7个回答
48
投票

不确定我是否正确理解您想要执行的操作,很可能 Table1 在另一个表中被引用为 FK。

如果你这样做:

EXEC sp_fkeys 'Table1'

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

这将为您提供“Table1”主键为 FK 的所有表。

删除表内存在的约束并不是删除表本身的必要步骤。删除引用“Table1”的每个可能的 FK。

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


18
投票

首先,你需要放弃你的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')

4
投票

使用...

Microsoft SQL Server Management Studio(v.18.11.1)

如果您尝试删除问题表,您将收到此错误:

为了能够删除此表,按照 @rjso 在他的 answer 中的建议,使用以下命令运行新查询以获取当前问题来自何处的第一个提示:

EXEC sp_fkeys 'Table1'
/* In this example the problem is in the table "Titular" */

这会告诉您问题实际出在哪里:

在此示例中,问题表是

Titular
,错误的参考指向表
Expediente
,位于第
id_persona
行。我们去那里吧:

右键单击

id_persona

然后删除关系:

这将允许您现在删除表格(在本例中为

Titular
表格)。

PS。当我将其放入数据库时,我忘记对其进行屏幕截图。这个解决方案有效。


3
投票

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


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 

3
投票

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

EXEC sp_fkeys 'Table_Name'

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

DROP TABLE Table_Name

注意:“dbo”。是默认的系统派生模式,因此您不必在命令中提及,如下所示。即使您提及该模式,也不必担心它会起作用。

DROP TABLE dbo.Table_Name


0
投票

选择 OBJECT_NAME(f.parent_object_id) AS 引用表, f.name AS 约束名 从 sys.foreign_keys AS f 内部联接 sys.tables AS t ON f.referenced_object_id = t.object_id 在哪里 t.name = '表名';

这是针对 mssql 的

© www.soinside.com 2019 - 2024. All rights reserved.