首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 模式 INSERT ALL INTO 报错 ORA-02291
更新时间:2026-05-28 02:06
本文介绍 OceanBase 数据库 Oracle 模式下执行 INSERT ALL INTO 语句报错 ORA-02991 的原因和解决方法。
适用版本
OceanBase 数据库 V4.1.x 之前的版本。
问题现象
OceanBase 数据库 Oracle 模式下执行 INSERT ALL INTO 语句报错。
ORA-02291: integrity constraint violated - parent key not found
示例如下。
执行以下命令创建表。
obclient [SYS]> create table test( -> id varchar2(10), -> name varchar2(10), -> constraint pk1 primary key(id), -> constraint fk1 foreign key(name) references test(id) -> ); Query OK, 0 rows affected (0.074 sec)执行以下命令插入数据。
obclient [SYS]> insert all into test(id, name) values('1', '1') -> into test(id, name) values('2', '1') -> select * from dual; ORA-02291: integrity constraint violated - parent key not found
Oracle 数据库执行正常。
创建表。
SQL> create table test( id varchar2(10), name varchar2(10), constraint pk1 primary key(id), constraint fk1 foreign key(name) references test(id) ); Table created.插入数据。
SQL> insert all into test(id, name) values('1', '1') into test(id, name) values('2', '1') select * from dual; 2 rows created.
OceanBase 数据库 V4.2.x 版本运行正常。
创建表。
obclient [SYS]> create table test( -> id varchar2(10), -> name varchar2(10), -> constraint pk1 primary key(id), -> constraint fk1 foreign key(name) references test(id) -> ); Query OK, 0 rows affected (0.206 sec)插入数据。
obclient [SYS]> insert all into test(id, name) values('1', '1') -> into test(id, name) values('2', '1') -> select * from dual; Query OK, 2 rows affected (0.031 sec)
问题原因
该问题是 OceanBase 数据库 V4.1.x 之前版本的已知缺陷,V4.1.x 之前版本的外键检查是在语句进行 DML 操作写入之前做的;对于一条语句插入多行的情况,后面的行对前面的行进行检查时发现前面的行实际还没有写入,所以会检查失败。
解决方法
目前老版本暂时没有修复计划,可以通过拆分成多个 INSERT 语句绕过。
obclient [SYS]> insert into test(id, name) values('1', '1');
Query OK, 1 row affected (0.014 sec)
obclient [SYS]> insert into test(id, name) values('2', '1');
Query OK, 1 row affected (0.009 sec)