【 使用环境 】
【 OB or 其他组件 】
【 使用版本 】数据库版本3.1.2 oceanbase-cliient 2.4.2
【问题描述】
【复现路径】执行工作流发布
【附件及日志】insert into ACT_RU_EXECUTION (ID_, REV_, PROC_INST_ID_, BUSINESS_KEY_, PROC_DEF_ID_, ACT_ID_, IS_ACTIVE_, IS_CONCURRENT_, IS_SCOPE_,IS_EVENT_SCOPE_, IS_MI_ROOT_, PARENT_ID_, SUPER_EXEC_, ROOT_PROC_INST_ID_, SUSPENSION_STATE_, TENANT_ID_, NAME_, START_ACT_ID_, START_TIME_, START_USER_ID_, 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 (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? ) , (?, 1, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ? )
'Cannot add or update a child row: a foreign key constraint fails'
,在外键约束检查时,引用的父表中没有找到匹配的记录,或者存在其他违反外键约束的情况。
- 检查下父表和子表 的结构定义及外键指向字段
- 手动验证父表中是否存在与子表外键对应的记录
另外数据库版本3.1.2较老了,建议升级到4.2.x
您好,都检查过了,目前定位到是PARENT_ID_和PROC_INST_ID_字段问题 都为ID_外键 去掉两个字段外键后成功 但是不知道为什么 外键如下 constraint ACT_FK_EXE_PARENT
foreign key (PARENT_ID_) references fic_xc.act_ru_execution (ID_)
on delete cascade,
foreign key (PROC_INST_ID_) references fic_xc.act_ru_execution (ID_)
on update cascade on delete cascade,
会和数据库的版本有关系吗,因为运维资源目前不在我这边
原因在上面已经说了,外键本身就是一个约束,引用的父表中没有找到匹配的记录,或者存在其他违反外键约束的情况都会导致这个问题,你禁用外键后没有了约束自然不报错了,但后续你这里就可能存在数据问题
和版本没关系的。
报错是因为你插入的数据违背了外键约束,子表的数据在父表中不存在,所以就禁止向子表插入数据了,看上去是符合预期的。
看上去这个外键是自引用的外键,就是说外键引用的子表和父表都是同一张表 act_ru_execution。
如果是的话,直接检查一下插入的这行数据的 PARENT_ID_ 列的值,在 ID_ 列是否不存在就好了。如果不存在,这个报错就是符合预期的。
没有关系,ob3.x 社区版已经不再提供技术支持了,后续出了大问题比较麻烦
哈哈,就是你插入的数据不满足你自己制定的外键约束呀,删掉这两个外键约束了,插入数据就不会检查数据的外键完整性了,所以就可以随便插入了。
还有一般是:foreign key (CHILD_ID) references fic_xc.act_ru_execution (ID),您这个 foreign key (PARENT_ID_) references fic_xc.act_ru_execution (ID_),是不是把外键的父子关系弄反了?
如果没弄反的话,感觉把列名从 PARENT_ID_ 改成 CHILD_ID_ 会比较合适,哈哈~
在你删掉外键,插入数据之后,如果还想查下具体是哪一行数据违背了外键约束,执行下面两行 SQL 就知道了:
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;
可以百度一下外键的作用:外键_百度百科
你是在sql中去掉了PARENT_ID_和PROC_INST_ID_两个字段,不是禁用了外键,应该是楼上说的外键是自引用的外键,那就没问题
我理解用户的意思是删掉了这两个外键。
而且这个问题就是数据违背外键约束了,用 minus 查一把就行,和自不自引用也没啥关系,哈哈~
这个是我把两个外键约束解开后,插入的数据
之前的数据是啥意思?没插入违反外键约束之前的旧数据?
请问下解开是啥意思?是删除掉这两个外键了是吧?
在你删掉外键,插入数据之后,如果还想查下具体是哪一行数据违背了外键约束,执行下面两行 SQL 就知道了:
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;
不妨执行下试试看?
还有你这几列的数据类型分别是啥?
都是varchar类型
这张图是插入违反外键约束的数据之后,查出来的数据?
把您的表结构和执行过的 DML 语句也都发下吧,让我们看看能不能复现这个问题?