- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在经历一个我接手的项目,在数据库方面我注意到以前的程序员写了一堆触发器来删除子记录。问题是,这些记录已经与我要删除的父记录具有外键关系。删除触发器只不过是子记录的简单删除语句。
编写触发器来删除子记录有什么好处,或者我可以将其更改为级联删除就可以了吗?
我使用的是 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/
我是一名优秀的程序员,十分优秀!