这张图是我删除两个外键后,请求成功查到的数据
请求成功说的是成功插入被外键检查出的非法数据之后的截图是吧?
发下表结构和这两条 insert 语句吧,我们复现下。
这个是工作流调用后内部执行报的错 我拿不到它执行的具体sql 不过我可以把已经存在的数据变成insert语句拿出来执行一下
你执行下
SELECT PARENT_ID_
FROM fic_xc.act_ru_execution
MINUS
SELECT ID_
FROM fic_xc.act_ru_execution;
SELECT PROC_INST_ID_
FROM fic_xc.act_ru_execution
MINUS
SELECT ID_
FROM fic_xc.act_ru_execution;
试试?
是的 您稍等一下 我复现一下
问题产生以及复现步骤如下:
1.调用工作流发起流程的接口,报错Cannot add or update a child row: a foreign key constraint fails
2.删除两个外键PARENT_ID和PROC_INST_ID_进行工作流发起流程的接口调用,成功插入数据
3.导出调用接口后,插入数据的insert语句有两条,内容如下
INSERT INTO fic_xc.act_ru_execution (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PARENT_ID_, PROC_DEF_ID_, SUPER_EXEC_, ROOT_PROC_INST_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_, IS_EVENT_SCOPE_, IS_MI_ROOT_, SUSPENSION_STATE_, CACHED_ENT_STATE_, TENANT_ID_, NAME_, START_ACT_ID_, START_TIME_, START_USER_ID_, LOCK_TIME_, LOCK_OWNER_, IS_COUNT_ENABLED_, EVT_SUBSCR_COUNT_, TASK_COUNT_, JOB_COUNT_, TIMER_JOB_COUNT_, SUSP_JOB_COUNT_, DEADLETTER_JOB_COUNT_, EXTERNAL_WORKER_JOB_COUNT_, VAR_COUNT_, ID_LINK_COUNT_, CALLBACK_ID_, CALLBACK_TYPE_, REFERENCE_ID_, REFERENCE_TYPE_, PROPAGATED_STAGE_INST_ID_, BUSINESS_STATUS_) VALUES (‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, 2, ‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, null, null, ‘FundsTransferred:1:1edfa9c4-5486-11ef-9907-005056ab435a’, null, ‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, null, 1, 0, 1, 0, 0, 1, null, ‘’, null, ‘sid-2283dc42-7561-4734-94fc-b7e8766a2243’, ‘2024-08-08 16:10:08.588’, ‘LoginUser(id=0cc4bca2f96b0ba0b649bf13a75ecce3, userType=2, tenantId=null, scopes=null, context=null)’, null, null, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null);
INSERT INTO fic_xc.act_ru_execution (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PARENT_ID_, PROC_DEF_ID_, SUPER_EXEC_, ROOT_PROC_INST_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_, IS_EVENT_SCOPE_, IS_MI_ROOT_, SUSPENSION_STATE_, CACHED_ENT_STATE_, TENANT_ID_, NAME_, START_ACT_ID_, START_TIME_, START_USER_ID_, LOCK_TIME_, LOCK_OWNER_, IS_COUNT_ENABLED_, EVT_SUBSCR_COUNT_, TASK_COUNT_, JOB_COUNT_, TIMER_JOB_COUNT_, SUSP_JOB_COUNT_, DEADLETTER_JOB_COUNT_, EXTERNAL_WORKER_JOB_COUNT_, VAR_COUNT_, ID_LINK_COUNT_, CALLBACK_ID_, CALLBACK_TYPE_, REFERENCE_ID_, REFERENCE_TYPE_, PROPAGATED_STAGE_INST_ID_, BUSINESS_STATUS_) VALUES (‘a091bdcc-555d-11ef-a7a2-54e1ad607dc9’, 1, ‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, null, ‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, ‘FundsTransferred:1:1edfa9c4-5486-11ef-9907-005056ab435a’, null, ‘a08fe909-555d-11ef-a7a2-54e1ad607dc9’, ‘sid-5471c3ae-41b4-4798-b0c6-a17fc2f69c21’, 1, 0, 0, 0, 0, 1, null, ‘’, null, null, ‘2024-08-08 16:10:08.600’, null, null, null, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, null, null, null, null, null, null);
4.重新添加两个外键后,执行insert语句成功,说明数据本身没有外键冲突问题
目前怀疑是两个执行语句的顺序,是否在数据库层面发生变化,如果第二个sql语句先执行是会有外键值匹配不上的情况
数据表结构如下
create table fic_xc.act_ru_execution
(
ID_ VARCHAR(64) default ‘NULL’ not null
primary key,
REV_ INT(10) default NULL null,
PROC_INST_ID_ VARCHAR(64) default ‘NULL’ null,
BUSINESS_KEY_ VARCHAR(255) default ‘NULL’ null,
PARENT_ID_ VARCHAR(64) default ‘NULL’ null,
PROC_DEF_ID_ VARCHAR(64) default ‘NULL’ null,
SUPER_EXEC_ VARCHAR(64) default ‘NULL’ null,
ROOT_PROC_INST_ID_ VARCHAR(64) default ‘NULL’ null,
ACT_ID_ VARCHAR(255) default ‘NULL’ null,
IS_ACTIVE_ TINYINT(3) default NULL null,
IS_CONCURRENT_ TINYINT(3) default NULL null,
IS_SCOPE_ TINYINT(3) default NULL null,
IS_EVENT_SCOPE_ TINYINT(3) default NULL null,
IS_MI_ROOT_ TINYINT(3) default NULL null,
SUSPENSION_STATE_ INT(10) default NULL null,
CACHED_ENT_STATE_ INT(10) default NULL null,
TENANT_ID_ VARCHAR(255) default ‘’ null,
NAME_ VARCHAR(255) default ‘NULL’ null,
START_ACT_ID_ VARCHAR(255) default ‘NULL’ null,
START_TIME_ DATETIME(23) default NULL null,
START_USER_ID_ VARCHAR(255) default ‘NULL’ null,
LOCK_TIME_ TIMESTAMP(23) default NULL null,
LOCK_OWNER_ VARCHAR(255) default ‘NULL’ null,
IS_COUNT_ENABLED_ TINYINT(3) default NULL null,
EVT_SUBSCR_COUNT_ INT(10) default NULL null,
TASK_COUNT_ INT(10) default NULL null,
JOB_COUNT_ INT(10) default NULL null,
TIMER_JOB_COUNT_ INT(10) default NULL null,
SUSP_JOB_COUNT_ INT(10) default NULL null,
DEADLETTER_JOB_COUNT_ INT(10) default NULL null,
EXTERNAL_WORKER_JOB_COUNT_ INT(10) default NULL null,
VAR_COUNT_ INT(10) default NULL null,
ID_LINK_COUNT_ INT(10) default NULL null,
CALLBACK_ID_ VARCHAR(255) default ‘NULL’ null,
CALLBACK_TYPE_ VARCHAR(255) default ‘NULL’ null,
REFERENCE_ID_ VARCHAR(255) default ‘NULL’ null,
REFERENCE_TYPE_ VARCHAR(255) default ‘NULL’ null,
PROPAGATED_STAGE_INST_ID_ VARCHAR(255) default ‘NULL’ null,
BUSINESS_STATUS_ VARCHAR(255) default ‘NULL’ null,
constraint ACT_FK_EXE_PARENT
foreign key (PARENT_ID_) references fic_xc.act_ru_execution (ID_)
on delete cascade,
constraint ACT_FK_EXE_PROCDEF
foreign key (PROC_DEF_ID_) references fic_xc.act_re_procdef (ID_),
constraint ACT_FK_EXE_PROCINST
foreign key (PROC_INST_ID_) references fic_xc.act_ru_execution (ID_)
on update cascade on delete cascade,
constraint ACT_FK_EXE_SUPER
foreign key (SUPER_EXEC_) references fic_xc.act_ru_execution (ID_)
on delete cascade
);
create index ACT_IDC_EXEC_ROOT
on fic_xc.act_ru_execution (ROOT_PROC_INST_ID_);
create index ACT_IDX_EXEC_BUSKEY
on fic_xc.act_ru_execution (BUSINESS_KEY_);
create index ACT_IDX_EXEC_REF_ID_
on fic_xc.act_ru_execution (REFERENCE_ID_);
‘NULL’ 这些 NULL 两边的单引号咋都是中文的字符,ACT_FK_EXE_PROCINST 这个外键又引用了其他的表,是不是可以直接删除掉?DML 也执行不成功,报了语法错,估计也是和中文字符相关。
辛苦帮忙给一套能让我们直接执行的复现问题的 SQL 序列吧,你先在自己的测试环境里面验证之后再给值班同学 @旭辉?
我昨天评论次数到限制了 这个我排查到了问题 是数据库版本问题 4.1.2是没有这个问题的 老版本对于外键校验这块是有问题的 具体什么原因 我不清楚
数据库4.2.1没问题
3.1.x可能有已知bug,我目前没有搜索到,咨询下相关老师,有进展回复你,建议升级到4.2.1及之后的LTS版本
要用外键推荐4.2.1版本,性能和稳定性方面比3.1.2更强更优秀,3.1.2外键不推荐使用。
您好 我想问一下 如果我用3.1.2版本的话 驱动建议用哪个版本呢 因为数据库升级目前我这边说了不算
jdbc 驱动都一样的,ob 驱动用最新版,mysql 驱动用 5.1.4x 或者 8.0.28
我用的是oceanbase-client这个没问题是把
没问题