SQL DROP TABLE外键约束

141 sql-server constraints foreign-keys drop-table database-table

如果我想像这样删除我的数据库中的所有表,它会处理外键约束吗?如果没有,我该如何处理?

GO
IF OBJECT_ID('dbo.[Course]','U') IS NOT NULL
    DROP TABLE dbo.[Course]
GO
IF OBJECT_ID('dbo.[Student]','U') IS NOT NULL
    DROP TABLE dbo.[Student]
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 312

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

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

SELECT * 
FROM sys.foreign_keys
WHERE referenced_object_id = object_id('Student')
Run Code Online (Sandbox Code Playgroud)

如果有,在这里使用此语句,您可以创建SQL语句以实际删除这些FK关系:

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)

  • 获取所有引用表的SELECT语句的替代方法是:EXEC sp_fkeys'Student'; (2认同)
  • 如何将您的最后一个选择分配为变量并执行它? (2认同)

小智 39

在SQL Server Management Studio 2008(R2)和更高版本中,您可以右键单击

DB - >任务 - >生成脚本

  • 选择要DROP的表.

  • 选择"保存到新查询窗口".

  • 单击"高级"按钮.

  • 将Script DROP和CREATE设置为Script DROP.

  • 将脚本外键设置为True.

  • 单击确定.

  • 单击下一步 - >下一步 - >完成.

  • 查看脚本,然后执行.

  • 仍然相同'无法删除对象'my_table',因为它是由FOREIGN KEY约束引用的. (11认同)
  • 这个答案如何有28+的评价超出了我...仍然没有合作伙伴 (5认同)
  • 虽然它确实生成了脚本 - 该脚本并没有解决问题,即删除外键约束引用的表。 (2认同)
  • SQL 2019,工作得很好,有外键约束,没有问题地通过它们。 (2认同)

Phi*_*ley 20

如果先删除"子"表,则外键也将被删除.如果您首先尝试删除"父"表,您将得到"无法删除对象'a',因为它是由FOREIGN KEY约束引用的." 错误.

  • 是的,如果目标是"如果我想要删除数据库中的所有表格",那么就是一个解决方案...... (4认同)
  • 考虑到提问者想要"删除我数据库中的所有表",这是一个比被接受的更好的答案. (4认同)
  • 没错,但没有解决方案。Child 可以有其他表的外键和/或您可能不想首先删除它。 (3认同)

小智 13

这是使用sp_MSdropconstraints过程正确删除所有表的另一种方法.我能想到的最短代码:

exec sp_MSforeachtable "declare @name nvarchar(max); set @name = parsename('?', 1); exec sp_MSdropconstraints @name";
exec sp_MSforeachtable "drop table ?";
Run Code Online (Sandbox Code Playgroud)

  • 这确实在这简单的两行的帮助下回答了最初的问题“如果我想删除数据库中的所有表”。至少对于我的 SQLServer 2019 来说是这样。谢谢。 (2认同)