gpt4 book ai didi

sql - 有没有办法可以在事务期间关闭 DELETE CASCADE 然后再次打开?

转载 作者:行者123 更新时间:2023-12-01 05:10:25 26 4
gpt4 key购买 nike

我有四个表:考试>目标和>目标>目标主题详细信息。我没有使用 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?如果没有,是否有其他方法可以简化此代码,还是必须始终执行三个删除操作?

最佳答案

级联删除是一种性能改进。虽然它与从最低层的删除过程做同样的事情,但它提供了额外的性能提升(可以检查执行计划)。

因此,最好的方法是进行删除级联,但为此我们必须删除现有的外键,在启用 ON DELETE NO ACTION 设置的情况下创建一个新外键。执行您的操作,然后执行相同的循环并再次关闭 ON DELETE CASCADE。

考虑到这些麻烦,我们手头的选择是检查底层表的架构和针对它们的代码,以确保打开删除级联不会影响任何数据,然后永久打开它。

因此,在一个事务中执行操作不是一种可行的技术。

我希望这有帮助。由于缺乏积分,我无法对帖子发表评论:) :)。对不起 :)

关于sql - 有没有办法可以在事务期间关闭 DELETE CASCADE 然后再次打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25498788/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com