【问题标题】:Is there a way to specify a cascading delete, on a query by query basis?有没有办法在逐个查询的基础上指定级联删除?
【发布时间】:2010-10-28 18:36:30
【问题描述】:

在我正在进行的一个项目中,我们有一些表具有许多外键关系,并且由于它处于早期开发阶段,关系的数量可能会发生变化。

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

我们考虑了以下选项:

  1. 忽略我们的直觉并设置级联删除
  2. 使用 set null 代替级联删除
  3. 编写并维护自定义脚本以手动删除所有外键记录

这些选项都不是很好:-(

  1. 我们不想设置级联删除,因为我们不希望这成为默认行为。
  2. 我们不想使用级联空值,因为留下大量孤儿将毫无用处。
  3. 编写自定义脚本会起作用,但它的可扩展性或可维护性不是很好。为单个表甚至几个表编写脚本是可以的,但是对于每个表呢?严重地?一定会有更好的办法!至少我希望有更好的方法。

对于“太久没读”的人群;快速总结

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

可能是这样的:

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

【问题讨论】:

    标签: sql-server sql-server-2008


    【解决方案1】:

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

    不希望它成为默认行为

    那你仍然可以:

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

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

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

    【讨论】:

    • 我担心不会有一个简单的选择。我不是为了系统的东西,它只是为了一些快速的一次性查询来设置和清理测试数据。我已经写了一堆脚本来完成这一切,但希望有更简单的方法。
    • @DocatJonez,为了清理测试数据,你可以使用第四个选项,我会更新答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    • 2011-04-04
    • 2019-04-26
    • 2011-04-20
    相关资源
    最近更新 更多