問題現象
使用如下的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執行的語句,方便分析確認問題