适用版本
OceanBase 数据库 V4.0 及之前的版本。
问题现象
批量 insert 语句执行报错 ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails,相同 SQL 在 MySQL 数据库中没有报错。
CREATE TABLE `karson_test` ( `ID_` varchar(64) COLLATE utf8_bin NOT NULL, `TEST_ID_` varchar(64) COLLATE utf8_bin NOT NULL, PRIMARY KEY (`ID_`), KEY `ACT_FK_TEST` (`TEST_ID_`), CONSTRAINT `ACT_FK_TEST` FOREIGN KEY (`TEST_ID_`) REFERENCES `karson_test` (`ID_`) ON DELETE CASCADE ON UPDATE CASCADE )
[root@127.1:52881][test]> insert into karson_test values('002','002'),('003','002');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
问题原因
OceanBase 数据库 V4.0 及之前的版本在批量 insert 的时候是先做外键检查,再做插入数据的写入。在上述例子中,外键关联的是同一张表的字段,主表从表为同一张表,批量 insert 时只有满足前面的数据插入表中,后面的数据才可正常插入。对插入数据 ('003','002') 检查的时候,数据 ('002','002') 还没有写入,所以会检查失败。
解决方法
- 将批量 insert 语句改成单行 insert 进行规避。
- 升级到问题已修复的版本。OceanBase 数据库 V4.0 之后的版本已修复。