小编典典

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

sql

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

编写触发器以删除子记录是否有好处,或者我可以仅将其更改为在删除时级联即可吗?

我正在使用MSSQL 2008。


阅读 239

收藏
2021-05-05

共1个答案

小编典典

*MSSQL Server中的 *CASCADE DELETE
只能级联到单个表。如果您有两个与维表具有外键关系的表,则只能级联删除到其中一个表。(这是为了防止删除通过多个路径级联并造成冲突,就像C
++允许多重继承,而C#仅允许单一继承一样)

在这种情况下,您将不得不使用触发器或在代码中专门处理该情况。

因此,我看到许多人在所有情况下都选择使用触发器。即使只有一张外国桌子。这样可以确保一致性,因此人们知道维护数据库时要查找的内容。

如果可以将一个删除级联到一个以上的表,我会说这将是最可取的选择。但是,这种限制使情况更加混乱,我目前更赞成拥有所有此类行为的触发器。就编码而言,使用触发器进行级联删除和更新的开销很小,但确实允许真正通用的标准实践。

编辑:

您可能想将“已接受的答案”移给其他人,我已经算出我在上述问题上是错的。

您可以有多个事实表,它们具有对DESIGNE Dimension表的ON DELETE CASCADE外键约束。

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

因此,例如…-
维度表[人](id INT IDENTITY,)
-维度表[考试](id INT IDENTITY,)
-面孔表[Exam_Score](person_id INT,exam_id INT,得分INT)

如果“人员”或“考试”中的任何一个被删除,则您希望关联的Exam_Score记录也被删除。

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

(向迈尔达德致歉,他试图向我解释这一点,但我完全错过了他的观点。)

2021-05-05