即使我正在删除并尝试删除表,我也会收到错误,
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给了我错误的脚本吗?
不确定我是否正确理解您想要执行的操作,很可能 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/
首先,你需要放弃你的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')
使用...
如果您尝试删除问题表,您将收到此错误:
为了能够删除此表,按照 @rjso 在他的 answer 中的建议,使用以下命令运行新查询以获取当前问题来自何处的第一个提示:
EXEC sp_fkeys 'Table1'
/* In this example the problem is in the table "Titular" */
这会告诉您问题实际出在哪里:
在此示例中,问题表是
Titular
,错误的参考指向表 Expediente
,位于第 id_persona
行。我们去那里吧:
右键单击
id_persona
:
然后删除关系:
这将允许您现在删除表格(在本例中为
Titular
表格)。
PS。当我将其放入数据库时,我忘记对其进行屏幕截图。这个解决方案有效。
您需要将 FK 放在已添加到的表上,现在可以是 Table2、Table3 或任何表,它将 Table1 的列引用为外键。然后你可以删除Table1。
您可以使用这些查询来查找表中的所有 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
发生这种情况是因为您尝试更改的表有一个主键(PK),该主键在另一个表中的某处被作为外键(FK)引用。要知道它是哪个表,请执行以下存储过程:
EXEC sp_fkeys 'Table_Name'
然后运行 drop 命令,如下所示:
DROP TABLE Table_Name
注意:“dbo”。是默认的系统派生模式,因此您不必在命令中提及,如下所示。即使您提及该模式,也不必担心它会起作用。
DROP TABLE dbo.Table_Name
选择 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 的