【问题标题】:When to use ON DELETE CASCADE何时使用 ON DELETE CASCADE
【发布时间】:2013-01-17 17:40:51
【问题描述】:

我想知道使用 ON DELETE CASCADE 是否是个好主意,例如下面的例子。所以我对何时使用 ON DELETE CASCADE 删除行有了一个大致的了解。

模块表:

ModuleId (PK) ModuleNo  ModuleName
11            CHI2333    ICT

Course_Module 表:

CourseId  ModuleId (FK)
3          11

会话表(考试):

SessionId  SessionName  ModuleId (FK)
5           ASDEE        11

在上面的示例中,如果我从 Module 表中删除一行,那么它将删除其他 2 个包含相同 ModuleId 的表中的行。在Course_Module 表中,它确定哪个课程包含哪些模块,在包含考试详细信息的Session 表中,它将删除包含已删除模块ID 的所有行(考试)。

对于上面的示例是否可以这样做,我的一般问题是在删除或删除父表中的行时使用 ON DELETE CASCADE 删除外键行是否明智和正常的做法?

【问题讨论】:

  • 这取决于,如果您想查看课程的任何历史记录,其中它具有某些过去的模块,尽管模不再存在,那么您可能想要保留。但是如果你不想要这样的分析信息,那么父母删除,孩子也被删除。
  • 啊,感谢您提供的信息。模块可能会被停用和重新激活。我可以创建一个布尔值来确定这一点。谢谢
  • @user - 请记住,级联删除在 MySQL 中有一些警告。例如,任何ON DELETE 触发器都不会针对作为删除级联的一部分删除的行执行。

标签: mysql sql


【解决方案1】:

我个人认为在代码中包含该逻辑而不是依赖数据库为您完成工作更好。这就是我编写所有应用程序的方式。

只要我的 2 美分。

【讨论】:

  • 也许你意识到了,但这是一个相当有争议的陈述——通常认为尽可能多的这样的东西应该在数据库层——那么如果你通过与你的应用程序不同的东西来访问数据那么事情仍然有效。
  • 是的,我明白你的意思,但是我用 SQLCE 做了很多工作,它不是最好的,因为它甚至不支持存储过程,所以也许我的评论是基于我必须做的事实而歪曲的在我的大多数应用程序中,应用程序级别的所有内容。无论哪种方式,我认为这是您如何处理此问题的个人选择,两种方式都有其优点和缺点。
猜你喜欢
  • 2010-10-07
  • 2015-12-31
  • 1970-01-01
  • 2015-01-27
  • 2016-09-28
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多