当前位置: 首页 > 面试题库 >

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

云锦
2023-03-14
问题内容

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

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

我正在使用MSSQL 2008。


问题答案:

*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是不可能的,因此需要触发器。

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



 类似资料:
  • 代码: 三个问题: > 我必须放置<code>CascadeType吗。在两个实体中删除?我希望它能正常工作,这样如果我删除了老师,课程就会自动删除。 在我的数据库中,我的id无法正常工作。我希望它使id每次增加一个,但它目前增加了一些随机数。为什么呢? 我还有两个类,但有关系。当我想在数据库中持久化一个新对象时,我必须做什么?

  • 问题内容: 假设我们有两个实体,A和B。B与A具有多对一关系,如下所示: 现在,我要删除对象,并将删除操作级联到其所有子项。有两种方法可以做到这一点: 添加到OneToMany批注中,让JPA删除所有子项,然后再从数据库中删除A对象。 保持类不变,只需让数据库级联删除操作即可。 使用后面的选项有什么问题吗?这会导致实体管理器保留对已删除对象的引用吗?我之所以选择选项2而不是选项1的原因是,选项1生

  • 问题内容: 我试图做一个简单的例子,以学习如何从父表中删除一行并使用Doctrine2自动删除子表中的匹配行。 这是我正在使用的两个实体: Child.php: 父亲.php 这些表已在数据库上正确创建,但未创建“删除级联”选项。我究竟做错了什么? 问题答案: 在教义中有两种级联: 1)ORM级别- 在关联中使用- 这是在UnitOfWork中完成的计算,不影响数据库结构。删除对象时,UnitOf

  • 我目前对EF Core有一些问题。我有一些需要删除的数据,我正在努力查看流畅的API是如何工作的,正是关于函数。 考虑到微软自己网站的经典博客/帖子场景,我想知道到底是什么实体,OnDelete()是“目标”(因为没有更好的词),在某些情况下,它似乎是博客,在另一些情况下,是帖子。是否可以从两侧定义级联删除(即当父博客被删除时,帖子被删除),如果是这样,我认为代码应该如下所示: <代码>模型。实体

  • 问题内容: 我必须缺少SQLAlchemy的层叠选项的琐碎内容,因为我无法获得简单的层叠删除来正确操作-如果删除了父元素,则子对象将使用外键保留。 我在这里放了一个简洁的测试用例: 输出: 父母与子女之间存在简单的一对多关系。该脚本创建一个父级,添加3个子级,然后提交。接下来,它删除父级,但子级仍然存在。为什么?如何使孩子级联删除? 问题答案: 问题是sqlalchemy认为是父级的,因为这是您定

  • 主要内容:JPA级联删除示例,输出结果级联移除用于指定如果父实体被移除,则其所有相关实体也将被移除。 以下语法用于执行级联删除操作 - JPA级联删除示例 在这个例子中,我们将创建两个相互关联的实体类,但要建立它们之间的依赖关系,我们将执行级联操作。 这个例子包含以下步骤 - 第1步: 在包下创建一个名为的实体类,其中包含属性:,,以及标记为级联规范的类型的对象。 文件: StudentEntity.java - 第2步: 在包下创建