Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否有一种方法可以逐个查询指定级联删除?_Sql Server_Sql Server 2008 - Fatal编程技术网

Sql server 是否有一种方法可以逐个查询指定级联删除?

Sql server 是否有一种方法可以逐个查询指定级联删除?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,在我正在进行的一个项目中,我们有一些表,其中包含许多外键关系,因为它处于早期开发阶段,关系的数量可能会发生变化 我们希望能够从某些表中删除记录,但不愿意在外键关系上设置级联删除 我们考虑了以下选项: 不管怎样,忽略我们的直觉,建立级联删除 使用set null代替级联删除 编写并维护自定义脚本以手动删除所有外键记录 这些选项都不是很好:-( 我们不希望设置级联删除,因为我们不希望这成为默认行为 我们不想使用级联空值,因为留下很多孤儿是没有用的 编写自定义脚本是可行的,但它的可伸缩性和可维护性不高

在我正在进行的一个项目中,我们有一些表,其中包含许多外键关系,因为它处于早期开发阶段,关系的数量可能会发生变化

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

我们考虑了以下选项:

  • 不管怎样,忽略我们的直觉,建立级联删除
  • 使用set null代替级联删除
  • 编写并维护自定义脚本以手动删除所有外键记录
  • 这些选项都不是很好:-(

  • 我们不希望设置级联删除,因为我们不希望这成为默认行为
  • 我们不想使用级联空值,因为留下很多孤儿是没有用的
  • 编写自定义脚本是可行的,但它的可伸缩性和可维护性不高。为单个表甚至几个表编写脚本是可以的,但为每个表编写脚本?说真的?一定有更好的方法!至少我希望有更好的方法
  • 对于“太久没读”的人群;快速总结

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

    也许是这样的:

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

    我不确定我是否真的看到手动级联选项在您的案例中的有用性。 级联是为了维持实体之间的某些关系,如果你,我引用

    我不想让它成为默认行为

    然后你仍然可以:

    • 发出多个查询以“手动”完成清理
    • 如果您希望通过单个调用来执行此操作,请使用存储过程,例如,您可能需要
      调用CASCADE\u DELETE('table\u name','id=3')
      (并且您可以在一个点上维护清理脚本)
    • 如果您希望使用触发器(例如,您可以在原始表上创建简单视图,从这些视图中删除将通过触发器级联,而从原始表中删除不会级联)
    但是,请注意,基本上您正在增加系统的复杂性,因为这可能只是未完成的系统设计。从长远来看,这不会真正帮助您,设计决策应该在破解功能之前解决(如果可能的话)

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

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

    我不想让它成为默认行为

    然后你仍然可以:

    • 发出多个查询以“手动”完成清理
    • 如果您希望通过单个调用来执行此操作,请使用存储过程,例如,您可能需要
      调用CASCADE\u DELETE('table\u name','id=3')
      (并且您可以在一个点上维护清理脚本)
    • 如果您希望使用触发器(例如,您可以在原始表上创建简单视图,从这些视图中删除将通过触发器级联,而从原始表中删除不会级联)
    但是,请注意,基本上您正在增加系统的复杂性,因为这可能只是未完成的系统设计。从长远来看,这不会真正帮助您,设计决策应该在破解功能之前解决(如果可能的话)

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

    我担心没有简单的选项。我不想为系统做点什么,只是为了一些快速的一次性查询来设置和清理测试数据。我现在已经编写了一系列脚本来完成这一切,但我是hopi“我认为有一个更简单的方法。@DocatJonez,为了清理测试数据,你可以使用第四个选项,我会更新答案。我担心不会有一个简单的选项。我不是在为系统寻找什么东西,只是为了一些设置和清理测试数据的快速一次性查询。我已经写了一堆scripts现在想做这一切,但希望有一个更简单的方法。@DocatJonez,为了清理测试数据,您可以使用第四个选项,我将更新答案