我了解专栏上
SET NULL
与 CASCADE
之间的根本区别,但尚不清楚 WHEN 是否应该更倾向于其中一个。
什么时候在列上设置
CASCADE
?
通常,当父级的生命周期比子级的生命周期短时,我们更喜欢
ON DELETE SET NULL
。
例如,考虑一个交付系统,其中每个
Parcel
恰好分配给一个 Route
/行程。所以存在 FK Parcel.RouteId
到 Route.Id
。系统用户可以创建一个 Route
,为其分配一些 Parcel
(设置 Parcel.RouteId
)。稍后,用户出于某种原因决定删除 Route
。我们当然不希望 Parcel
中的 Route
也被删除。所以我们为这个 FK 指定 ON DELETE SET NULL
。
可以考虑三种模式。
设置NULL时,外键会注意到父行的删除。然后,外键将通过将每个子行上的 ParentId 更新为 null 来孤立子行。
在set CASCADE中,外键会注意到父行的删除。然后外键将删除子行。
选择这两种模式主要考虑的是是否允许无父子行。
在强制外键(默认行为)中,外键将注意到父行的删除并注意到存在子行。然后外键将回滚事务,恢复父行。
选择此模式和其他两种模式之间的主要考虑因素是数据库或用户是否应该处理解决违反外键的删除。通过回滚事务,数据库可以防止子行的意外删除/更新。这允许用户评估/更改他们的请求。