什么时候应该在外键上设置 NULL 而不是 CASCADE?
When should you set NULL instead of CASCADE on a Foreign Key?
我正在学习 SQL,尤其是外键方面的进步。我了解 set NULL 与 set CASCADE 之间的区别,但我不清楚在哪种情况下,应该在外键上设置 NULL 而不是 set CASCADE?
可以考虑三种模式。
设置NULL时,外键会通知父行的删除。然后外键将通过将每个子行上的 ParentId 更新为 null 来孤立子行。
在set CASCADE中,外键会通知父行的删除。然后外键将删除子行。
选择这两种模式的主要考虑因素是是否允许无父子行。
在强制外键(默认行为)中,外键会注意到父行的删除并注意到有子行。然后外键将回滚事务,恢复父行。
选择此模式与其他两种模式之间的主要考虑因素是数据库或用户是否应处理解决违反外键的删除操作。通过回滚事务,数据库可以防止意外 deletes/updates 的子行。这允许用户 evaluate/change 他们的请求。
通常我们更喜欢 ON DELETE SET NULL
,因为 parent 的生命周期比 child 的生命周期短。
例如,考虑一个交付系统,其中每个 Parcel
被分配给恰好一个 Route
/行程。所以存在 FK Parcel.RouteId
到 Route.Id
。系统用户可以创建一个 Route
,为其分配一些 Parcel
(设置 Parcel.RouteId
)。稍后,用户出于某种原因决定删除 Route
。我们绝对不希望 Route
中的 Parcel
s 也被删除。所以我们为这个FK指定ON DELETE SET NULL
。
我正在学习 SQL,尤其是外键方面的进步。我了解 set NULL 与 set CASCADE 之间的区别,但我不清楚在哪种情况下,应该在外键上设置 NULL 而不是 set CASCADE?
可以考虑三种模式。
设置NULL时,外键会通知父行的删除。然后外键将通过将每个子行上的 ParentId 更新为 null 来孤立子行。
在set CASCADE中,外键会通知父行的删除。然后外键将删除子行。
选择这两种模式的主要考虑因素是是否允许无父子行。
在强制外键(默认行为)中,外键会注意到父行的删除并注意到有子行。然后外键将回滚事务,恢复父行。
选择此模式与其他两种模式之间的主要考虑因素是数据库或用户是否应处理解决违反外键的删除操作。通过回滚事务,数据库可以防止意外 deletes/updates 的子行。这允许用户 evaluate/change 他们的请求。
通常我们更喜欢 ON DELETE SET NULL
,因为 parent 的生命周期比 child 的生命周期短。
例如,考虑一个交付系统,其中每个 Parcel
被分配给恰好一个 Route
/行程。所以存在 FK Parcel.RouteId
到 Route.Id
。系统用户可以创建一个 Route
,为其分配一些 Parcel
(设置 Parcel.RouteId
)。稍后,用户出于某种原因决定删除 Route
。我们绝对不希望 Route
中的 Parcel
s 也被删除。所以我们为这个FK指定ON DELETE SET NULL
。