社区版OceanBase 版本号:5.7.25-OceanBase_CE-v4.1.0.0,发现在多表关联有外键关系时候,执行删除操作报错:Cannot delete or update a parent row: a foreign key constraint fails

1、在使用贵公司的社区版OceanBase ,版本号:5.7.25-OceanBase_CE-v4.1.0.0时候,发现在多表关联有外键关系时候,执行删除操作报错:Cannot delete or update a parent row: a foreign key constraint fails

2、表关系描述如下:
1) 父表t_a_group,群组表

   CREATE TABLE `t_a_group` (
  `oid` bigint(20) NOT NULL AUTO_INCREMENT,
  `group_name` varchar(100) COLLATE utf8mb4_bin NOT NULL,
  `user_oid` bigint(20) NOT NULL,
  PRIMARY KEY (`oid`),
  CONSTRAINT `FK_ISS_GRP_ISS_OID` FOREIGN KEY (`user_oid`) REFERENCES `test_db`.`t_user`(`oid`) ON UPDATE RESTRICT ON DELETE RESTRICT ,
  KEY `FK_ISS_GRP_ISS_OID` (`user_oid`) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 1000008 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;

2)子表t_a_group_privilege,权限表

CREATE TABLE `t_a_group_privilege` (
  `oid` bigint(20) NOT NULL AUTO_INCREMENT,
  `access_id` varchar(40) COLLATE utf8mb4_bin DEFAULT NULL,
  `a_group_oid` bigint(20) NOT NULL,
  PRIMARY KEY (`oid`),
  CONSTRAINT `FK_ISS_GRP_PRVG_ISS_GRP_OID` FOREIGN KEY (`a_group_oid`) REFERENCES `test_db`.`t_a_group`(`oid`) ON UPDATE RESTRICT ON DELETE RESTRICT ,
  KEY `FK_ISS_GRP_PRVG_ISS_GRP_OID` (`a_group_oid`) BLOCK_SIZE 16384 LOCAL
) AUTO_INCREMENT = 1000033 AUTO_INCREMENT_MODE = 'ORDER' DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_bin ROW_FORMAT = DYNAMIC COMPRESSION = 'zstd_1.3.8' REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0;

说明:上述父表与子表通过外键关联

3、执行删除操作
1)通过代码执行,执行下面两行代码,报错 :Cannot delete or update a parent row: a foreign key constraint fails
aGroupPrivilegeService.delete(oid);
aGroupService.delete(oid);

2)通过SQL语句执行,一样报错:Cannot delete or update a parent row: a foreign key constraint fails
BEGIN;
delete from t_a_group_privilege where oid = 1000031;
delete from t_a_group where oid=1000006;
COMMIT;

---------------------------------------- 分割线 ------------------------------------------------------------
提问:
1、请问是什么原因导致删除不掉?
2、有什么解决方案吗?

这是因为外键约束所以无法删除。外键约束的概念定义同mysql,你需要关闭外键约束,再删除数据,之后再重新打开外键约束。

外键约束: CONSTRAINT FK_ISS_GRP_PRVG_ISS_GRP_OID FOREIGN KEY (a_group_oid) REFERENCES test_db.t_a_group(oid) ON UPDATE RESTRICT ON DELETE RESTRICT ,

1、如果是先删除父表,再去删除子表,外键约束才会起作用,提示有外键约束无法删除
2、但是我现在的操作是先删除子表数据,再去删除父表数据,按理外键约束是不会起作用的

保证上面描述的条件全部一致情况下,
我在mysql去验证,先删除子表数据,再去删除父表数据,是正常删除的
但是我在oceanBase去操作,就会提示外键约束删除失败

你安装版本是多少,我们在4.1最新版本修复过这个在同一个事务内先删子表再删除父表的问题,如果你分开两个事务应该旧版本也是可以的

1691031618595
这个版本,也就是官网上描述的社区版,通过docker安装方式,安装的这个版本

麻烦确认下是不是分开两个事务就成功了?

通过执行SQL语句,显式添加事务执行,分开两个事务单独执行每条SQL语句是可以成功的,操作如下:

语句一:
BEGIN;
delete from t_a_group_privilege where oid = 1000031;
COMMIT;

语句二:
BEGIN;
delete from t_a_group where oid=1000006;
COMMIT;

如果两句SQL语句共用一个事务会失败的,语句如下:
BEGIN;
delete from t_a_group_privilege where oid = 1000031;
delete from t_a_group where oid=1000006;
COMMIT;

不好意思,没注意看你的父子表关系,你的操作是没有问题的。这个我找一下相关同学确认一下

好的,谢谢了,请帮我确认一下
1、请问是什么原因导致删除不掉?
2、有什么解决方案吗?

  1. 之前同一个事务边对行约束的检查有bug
  2. 升级到4.1的最新版本,已经修复过的问题

你好,看xuyu同学的回复,这个是之前的一个bug,需要升级到4.1的最新版本。

这个我尝试过,但是你们社区版,通过docker方式去部署,最新的镜像并没有发布上去,现在依旧是四个月前的


或者说给我一个具体的下载链接,我去下载对应最新社区版版本

镜像我们尽快推上去,可以去下载中心下载最新的版本:https://www.oceanbase.com/softwarecenter