即使我正在删除并尝试删除表,我也会收到错误,
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服务器给了我错误的脚本吗?
答案 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