Sql server 是否有一种方法可以逐个查询指定级联删除?
在我正在进行的一个项目中,我们有一些表,其中包含许多外键关系,因为它处于早期开发阶段,关系的数量可能会发生变化 我们希望能够从某些表中删除记录,但不愿意在外键关系上设置级联删除 我们考虑了以下选项:Sql server 是否有一种方法可以逐个查询指定级联删除?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,在我正在进行的一个项目中,我们有一些表,其中包含许多外键关系,因为它处于早期开发阶段,关系的数量可能会发生变化 我们希望能够从某些表中删除记录,但不愿意在外键关系上设置级联删除 我们考虑了以下选项: 不管怎样,忽略我们的直觉,建立级联删除 使用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,为了清理测试数据,您可以使用第四个选项,我将更新答案