You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server是否始终通过外键约束强制实施参照完整性?

SQL Server外键与参照完整性问题解答

外键约束是否一直保证无孤儿记录?

正常情况下,正确创建的外键约束会严格强制参照完整性,子表的外键值必须对应父表中存在的主键/唯一键(除非外键字段允许NULL),不会出现孤儿记录。

INSTEAD OF DELETE触发器写坏了会怎样?

如果父表用了INSTEAD OF DELETE触发器,而且触发器逻辑写错了——比如没先删关联子记录就直接删父记录,SQL Server不会自动拦着。因为INSTEAD OF触发器会替换默认的删除逻辑,外键约束的检查会被触发器的自定义逻辑覆盖,这种情况就会产生孤儿记录。

举个错误的触发器例子:

CREATE TRIGGER trg_Parent_InsteadOfDelete ON Parent
INSTEAD OF DELETE
AS
BEGIN
    -- 错误:没先处理子表关联数据就删父表
    DELETE FROM Parent WHERE Id IN (SELECT Id FROM deleted);
END

要是子表还有关联记录,执行删除父记录的操作时,这个触发器会直接删掉父记录,子表的外键值就找不到对应的父记录,变成孤儿。

左连接能不能放心依赖外键?

如果外键约束一直被正确维护(没写错触发器、没禁用约束、没绕过约束的操作),那:

  • 父表左连接子表:子表侧可能出现NULL(当父记录没有对应子记录时)
  • 子表左连接父表:父表侧不会出现NULL(外键保证子记录的外键值一定在父表存在)

但如果出现触发器写错、约束被禁用/绕过的情况,子表左连接父表就会出现NULL(也就是孤儿记录)。


内容的提问来源于stack exchange,提问作者Kolti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:56:06