从复杂数据库中删除数据



假设我有一个列为IDCompanyIdCustomers表。

我需要从数据库中删除一些公司。

问题是,这个表有很多子表,这些表也有很多子表格等等…

只是澄清一下,所有的关系都是有约束的。

我怎样才能做到这一点?

谢谢。

编辑:注意,我要做的是一次性操作。

无论我是要改变约束还是添加触发器或诸如此类的东西,我都计划最终删除它。

此问题的内置解决方案是使用ON DELETE CASCADE设置FK约束。

然而,许多人(包括我自己)对此感到有些不安,因为错误的删除会在数据库中悄悄传播。

这里有三种方法:

  • 在事务处理中,使用存储过程先删除子行,然后再删除父行

我个人不会让它变得动态,会有一个特定的"DeleteCompany"过程。您可能需要一条规则,例如"如果销售额>1亿,则不删除",需要检查

  • 外键上的级联删除

如果你有多个级联路径,这可能很棘手,但在其他方面很简单

  • INSTEAD OF触发器

INSTEAD OF触发器类似于操作中的存储过程。注意:在AFTER触发器触发之前,您将获得FK违规

就我个人而言,我会使用存储过程,这样我就可以显式删除。其效果与级联FKs相同,但更明显。

对于SQL Server 2008,以下是解决方案:

SQL 2008中从外键关系生成Delete语句?

使用此解决方案,您可以很容易地找到正确的DELETE序列,同时尊重外键的关系。

如果你对这个主题感兴趣,你也可以阅读ORACLE PL/SQL解决方案:

如何在PL/SQL中基于表FK关系生成DELETE语句?

最新更新