YashanDB 知识库|自关联外键插入失败? 别慌,问题出在“判断时机”
在使用 YashanDB 构建数据模型过程中,部分用户在创建自关联外键表并插入数据时,遇到如下错误:
复制代码
这类报错在 Oracle 中并不会出现,YashanDB 却插入失败。为什么会这样?本文将详细解析原因,并给出规避建议。

一、问题现象复现
建表语句:
复制代码
插入语句:
复制代码
该插入语句中,两行数据是互相引用的,理论上在同一事务中应满足外键约束。
但在 YashanDB 中执行会报错:
复制代码
二、影响与风险

三、问题原因解析
关键点在于外键校验的
YashanDB 当前对外键完整性约束的判断采用的是“逐行校验”模式:
每插入一行数据,立即检查其外键是否存在;
不会等待整个事务完成后统一判断。
而上面的插入语句是两行数据互为父子关系,同时插入,如果系统逐行判断:
插入第 1 行:t2=2.但此时 t1=2 还没插入,判断失败;
插入第 2 行:同理。
最终,报外键违反错误。

四、Oracle 的行为
Oracle 对同样的插入语句不会报错,原因是:
Oracle 支持事务级外键判断;
会等待整个 INSERT ALL 完成后,再判断外键约束是否成立;
这样在事务内部引用自己的数据是被允许的。
五、解决办法与规避建议
1、暂时关闭外键约束(推荐)
在插入前关闭约束,插入后重新启用:
复制代码
2、拆分插入语句
将数据分批插入,确保父行先插入:
复制代码
3、等待后续版本优化
YashanDB 后续版本若支持事务级外键校验,则该问题可自动解决。当前尚未支持。
六、经验总结

评论