症状
插入或更新以违反外键约束失败,说明子行引用了不存在的父键。父侧删除在子行仍引用且未定义级联时同样失败。批量加载先写子后写父是常见触发点,并发事务在加载中途删除父行也会如此。
诊断
读取约束名与列;查询父行是否存在;检查 ON DELETE 规则。
psql -c "\d+ child_table"
根因
操作试图创建或保留一个外键在父表中无匹配行的子行,违反了数据库强制执行的引用完整性。
修复
写子行前确保父行存在,并让批量操作按父先子后的顺序执行;按语义选择 ON DELETE 动作,如 cascade 删除子行或 set null 解除关联,而非保留默认 restrict 而在日后失败。
验证
重跑写入确认成功,并确认引用行指向存在的父行。约束满足即证明顺序与规则正确。
常见陷阱
用级联删除而不评估影响会无意删除大量子数据;应结合业务语义选择动作。