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
相关产品推荐
相关产品推荐

