sql server里外键删了更新咋办,规则那些事儿要搞清楚
- 问答
- 2026-01-01 22:43:26
- 3
主要综合自微软官方文档MSDN关于FOREIGN KEY约束的说明、以及像SQL Server Central这类技术社区中资深DBA的实践经验分享)
在SQL Server里折腾数据库,尤其是当你的表不是孤零零一张,而是好几张表互相有关系的时候,外键这东西就太重要了,它就像是个热心肠的保安,或者一个特别严格的管家,时刻盯着你的一举一动,确保你不会乱来,不会留下“孤儿记录”(就是子表里某个数据指向的主表数据已经不存在了),这个管家有时候也挺烦人的,你可能在删数据或者改数据的时候,因为它而失败,错误信息直接就蹦出来了,这时候,有些性子急的开发者可能脑袋一热,就想:“得了,把这烦人的外键约束删了算了,等操作完再给它加回去。”
听我一句劝,“外键删了更新咋办”这个想法,绝大多数情况下都是一个巨大的陷阱,千万别轻易这么干,你这么干,相当于把数据库一段时间内的数据完整性保障给撤掉了,风险非常高,正确的做法不是删除外键,而是你要真正搞明白外键约束自带的那些“规则”(Rule),让这个严格的管家按照你预设的、合理的方式去工作,而不是把它开除。
外键约束到底有哪些规则呢?主要就是针对两种操作:删除(DELETE)和更新(UPDATE),你可以为每种操作单独设置规则。
先说删除规则(ON DELETE)。 这个规则决定了当你试图删除主表(被引用表)中的某一行时,如果子表(引用表)里还有数据指着这一行,SQL Server应该怎么办,它有几种模式:
第一种,也是最常用、最严格的,叫做NO ACTION,这个是默认设置,它的态度非常强硬:“只要子表里还有记录关联着这个主键,你就别想删!” 你一下删除命令,SQL Server会立刻去子表里检查,如果发现有“孩子”存在,立马就报错,拒绝执行删除操作,这能最大程度地防止误删,保证数据不会出现不一致,比如你想删掉一个部门,但这个部门底下还有员工记录,用NO ACTION规则的话,删除就会失败,提醒你先去处理那些员工记录。
第二种,叫做CASCADE,中文叫“级联删除”,这个规则比较“狠”,它的逻辑是:“你删主表的记录是吧?行,我帮你把子表里所有跟这条记录有关的数据,也一块儿删了!” 这听起来很省事,但危险性也最高,万一你一不小心手滑,误删了一条主表记录,可能瞬间就导致子表里成百上千条数据莫名其妙地消失,而且很难恢复,所以用这个规则要极其小心,通常只在一些有强烈父子从属关系、子表数据生命期严格依赖于主表的场景下才考虑。
第三种,叫做SET NULL,这个规则温和一些:“你删主表记录,我不拦着你,但我也不会跟着删子表数据,我会把子表里对应外键字段的值设置成NULL。” 这要求你这个外键字段在设计时允许为NULL值,这样做的好处是,子表数据本身保留了,只是它指向的那个“上级”没了,变成了一个“没娘的孩子”,这在某些业务逻辑下是合理的,比如一个客户记录被删除了,但与他相关的历史咨询记录还需要保留,只是客户ID可以置空。
第四种,叫做SET DEFAULT,这个和SET NULL类似,只不过它不是把外键字段设成NULL,而是设成一个你预先定义好的默认值,这同样需要外键字段有默认值约束,你可以设定一个“默认部门”,当某个部门被删除时,原本属于这个部门的员工,其部门ID自动被归到这个“默认部门”下,不至于让员工记录变成“黑户”。
再说更新规则(ON UPDATE)。 这个规则处理的是另一种情况:你不是要删除主键值,而是要修改主键的值,注意,通常我们是不建议频繁修改主键的,但有时候业务变化确实需要,更新规则的选项和删除规则几乎是对应的,也是NO ACTION(默认,阻止修改)、CASCADE(级联更新,主键变,子表外键跟着一起变)、SET NULL(主键变,子表外键置空)和SET DEFAULT(主键变,子表外键设为默认值)。
回到最开始的问题。“外键删了更新咋办?” 答案应该是:尽量不要删。 你应该先去检查一下你这个外键约束当前设置的规则是什么?是不是默认的NO ACTION让你觉得碍事了?如果你的业务逻辑允许甚至要求进行级联删除或置空操作,那你应该去修改外键约束的规则,而不是删除约束。
你认为“删除一个订单头时,应该自动把对应的订单明细也删掉”是合理的,那你就把ON DELETE规则从NO ACTION改成CASCADE,这样你删除订单头时,操作就能顺利成功,而且数据依然是完整的,不会出现光有明细没有头的怪异数据,这才是从根本上解决问题的方法,既满足了操作需求,又继续保持了数据库的数据完整性。
外键约束不是你的敌人,它是一个保护机制,你觉得它碍事,往往是因为你没有和它“沟通”好,没有把适合你业务场景的规则告诉它,把NO ACTION, CASCADE, SET NULL, SET DEFAULT这几个规则的事儿彻底搞清楚,根据实际情况灵活且谨慎地运用,你就能和这个严格的管家和睦相处,让它真正为你服务,而不是总给你添堵,直接删除外键是偷懒且危险的行为,相当于为了图一时方便,把家里的门锁给拆了,后果可能很严重。

本文由寇乐童于2026-01-01发表在笙亿网络策划,如有疑问,请联系我们。
本文链接:https://haoid.cn/wenda/72717.html
