SQL外键约束何时选用SET NULL与CASCADE,二者适用场景有何区别?
外键
CASCADE级联删除适用场景 CASCADE的核心逻辑是「父表数据删除/主键修改时,自动同步删除/修改子表的关联数据」,适合子数据完全依附于父数据存在、没有独立存在意义的场景,典型适用场景如下:
- 强从属的父子实体关联:比如「订单表」和「订单商品明细表」,订单本身作废删除时,对应的明细条目没有任何留存价值,设置
ON DELETE CASCADE可以直接自动清理所有关联明细,避免留下无效的孤儿数据,也不需要额外编写业务删除逻辑。 - 多对多关系的中间关联表:比如「用户表」和「角色表」的中间表
user_role_rel,当用户被删除/角色被删除时,中间表对应的关联关系本身就已经失效,设置级联删除可以直接清理无效关联,不需要额外处理中间表数据。 - 无独立留存价值的附属数据:比如用户的浏览历史、临时操作日志、用户上传的私有临时文件记录等,当用户账号注销删除时,这些附属数据不需要单独留存,用级联删除可以一次性清理干净。
注意避坑
CASCADE绝对不能用于父表和子表都属于独立核心实体的场景:比如「商品表」和「订单表」的外键关联,删除商品时绝对不能同步删除已经生成的有效订单,这种场景更适合用RESTRICT(阻止删除被关联的商品)或者SET NULL(保留订单,仅清空关联的商品ID)。
另外如果你的表关联层级很深,要提前梳理级联删除的链路,避免删除一条父数据时触发意料之外的大面积数据删除。
内容的提问来源于stack exchange,提问作者Quan Bui
相关产品推荐
相关产品推荐

