gpt4 book ai didi

sql - 级联删除还是使用触发器?

转载 作者:行者123 更新时间:2023-12-02 04:10:35 25 4
gpt4 key购买 nike

我正在经历一个我接手的项目,在数据库方面我注意到以前的程序员写了一堆触发器来删除子记录。问题是,这些记录已经与我要删除的父记录具有外键关系。删除触发器只不过是子记录的简单删除语句。

编写触发器来删除子记录有什么好处,或者我可以将其更改为级联删除就可以了吗?

我使用的是 MSSQL 2008。

最佳答案

MSSQL Server中的

CASCADE DELETE只能级联到单个表。如果有两张表与维度表有外键关系,则只能级联删除其中一张。 (这是为了防止删除通过多个路径级联并产生冲突,就像 C++ 允许多重继承但 C# 只允许单继承一样)

在这种情况下,您被迫使用触发器或在代码中专门处理这种情况。

出于这个原因,我看到很多人在所有情况下都选择使用触发器。即使只有一张外部表。这确保了一致性,让人们知道在维护数据库时要寻找什么。

如果可以将删除级联到多个表,我会说这将是最可取的选择。然而,这种限制使事情变得更加困惑,我目前更倾向于拥有所有此类行为的触发器。使用触发器进行级联删除和更新的开销在编码方面只是很小,但确实允许真正通用的标准实践。

编辑:

您可能想将“接受的答案”转移给其他人,我发现我在上述方面错了。

您可以拥有多个事实表,这些事实表对单个维度表具有 ON DELETE CASCADE 外键约束。

您不能做的是让一个事实表对多个维度表具有 ON DELETE CASCADE 外键约束。

例如...
- 维度表[人] (id INT IDENTITY, )
- 维度表[考试] (id INT IDENTITY, )
- 面孔表[Exam_Score](person_id INT,exam_id INT,score INT)

如果删除“人员”或“考试”,您会希望关联的 Exam_Score 记录也被删除。

在 MS SQL Server 中使用 ON DELETE CASCADE 是不可能的,因此需要触发器。

(向 Mehrdad 道歉,他试图向我解释这一点,但我完全没有理解他的观点。)

关于sql - 级联删除还是使用触发器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1457013/

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