我有四张桌子:考试>目标和>目标>客观主题细节。我没有在正常操作中使用DELETE CASCADE我不希望在有目标等情况下删除考试。
我创建了这个SQL来在SQL Server 2012存储过程中执行DELETE。
BEGIN
DELETE ot
FROM ObjectiveTopic ot
INNER JOIN ObjectiveDetail od
ON ot.ObjectiveDetailId = od.ObjectiveDetailId
INNER JOIN Objective o
ON od.ObjectiveId = o.ObjectiveId
INNER JOIN Exam e
ON o.ExamId = e.ExamId
WHERE e.SubjectId = @SubjectId
DELETE od
FROM ObjectiveDetail od
INNER JOIN Objective o
ON od.ObjectiveId=o.ObjectiveId
INNER JOIN Exam e
On o.ExamId = e.ExamId
Where e.SubjectId = @SubjectId;
DELETE o
FROM Objective o
INNER JOIN Exam e
ON o.ExamId = e.ExamId
WHERE SubjectId = @SubjectId
RETURN 0;
END
这确实有效,但不是三次删除。有没有办法在事务中打开DELETE CASCADE,删除特定@SubjectId的所有目标,然后再次关闭DELETE CASCADE?如果没有其他方式我可以简化这个代码,或者我总是要做三次删除?
答案 0 :(得分:1)
级联删除是一项性能改进。虽然它与最低子项的删除过程完全相同,但它可以提高性能(可以检查执行计划)。
所以,最好的方法是删除级联,但为此我们必须删除现有的外键,在启用ON DELETE NO ACTION设置的情况下创建一个新的外键。执行您的操作,然后完成相同的循环并再次关闭“删除CASCADE”。
考虑到这些问题,我们手头的选项是检查基础表的架构和针对它们的代码,以确保启用删除级联不会影响任何数据,然后永久地打开它。
因此,在一次交易中执行操作不是一种可行的技术。
我希望这会有所帮助。由于缺乏积分,我无法对帖子发表评论:) :)。对不起:)