问题现象
使用如下的sql语句创建自关联外键表:
drop table self_f_key;
create table self_f_key(t1 number primary key not null, t2 number);
create index i_s_1 on self_f_key(t2);
alter table self_f_key add constraint c_0001 foreign key(t2) references self_f_key(t1);
然后使用如下语句,尝试插入两行数据,这两行数据汇总起来,是符合外键关联关系的:insert into self_f_key select 1,2 from dual union all select 2,1 from dual;
但是yashandb插入失败:
问题的风险及影响
影响正常的业务处理流程,同样的建表语句,同样的insert,可以在oracle中正常执行:
问题影响的版本
所有的yashandb版本
问题发生原因
目前yashandb在处理此种情况下的完整性约束判断时,没有在事务级进行统一判断,而是使用了类似于一行一行的判断逻辑,
所以在事务级看来没有违反完整性约束的数据无法插入
解决方法及规避方式
规避方法:禁用外键约束
问题分析和处理过程
根据现网的问题场景,构造可以同时在yashandb/oracle执行的sql语句,比较并确认双方的表现差异
yashandb对于此种情况下完整性约束的判断核心在idxCheckKeyExist方法中
经验总结
构造可以同时在yashandb/oracle执行的语句,方便分析确认问题
标签:语句,yashandb,parent,self,外键,插入,key,YashanDB From: https://www.cnblogs.com/YashanDB/p/18343324