有没有办法在逐个查询的基础上指定级联删除?

时间:2010-10-15 09:10:02

标签: sql-server sql-server-2008

在我正在研究的项目中,我们有一些表与许多外键关系,并且因为它处于早期开发阶段,关系的数量可能会发生变化。

我们希望能够删除某些表中的记录,但不愿意在外键关系上设置级联删除。

我们考虑了以下选项:

  1. 无论如何,忽略我们的直觉并设置级联删除
  2. 使用set null
  3. 而不是级联删除
  4. 编写并维护自定义脚本以手动删除所有外键记录
  5. 这些选项都不是很好: - (

    1. 我们不想设置级联删除,因为我们不希望这是默认行为。
    2. 我们不想使用级联空值,因为留下大量孤儿是没用的。
    3. 编写自定义脚本可行,但它的可扩展性或可维护性不高。为单个表甚至几个表编写脚本都可以,但对于每个表都可以吗?真的吗?肯定有更好的办法!至少我希望有更好的方法。
    4. 对于“太长没读”的人群;快速摘要

      是否有一种方法可以在逐个查询的基础上指定您想要删除级联?

      也许看起来像这样:

      -- wouldn't it be nice if this was a real command!
      CASCADE DELETE FROM MyTable WHERE ID = @ID
      

1 个答案:

答案 0 :(得分:4)

我不确定在你的情况下我真的看到了手动级联选项的用处。 CASCADE用于维护实体之间的某些关系,如果您和我引用,

  

不希望它成为默认行为

然后你仍然可以:

  • 发出多个查询,将“手动”清理
  • 如果您想通过一次调用来使用存储过程,例如,您可能会有CALL CASCADE_DELETE('table_name', 'id = 3')(并且您将获得一个维护清理脚本的单点)。
  • 如果您想要使用触发器(例如,您可以在原始表上创建简单视图,从这些视图中删除将级联 - 通过触发器,并从原始表中删除不会级联)

但是,请注意,基本上你正在增加系统的复杂性,因为可能只是未完成的系统设计。从长远来看,这不会对你有所帮助,在破解功能之前应该解决设计决策(如果可能的话)。

编辑: 如果目的是清理测试数据以符合实际的完整性规则,那么您可以使用适当的规则创建适当的表,然后将数据从测试数据表移动到正确的表。 不符合正确完整性的行将使插入失败,您将获得干净的数据。