违反完整性约束 - 未找到父键

问题描述

我正在创建两个表,每个表都有一个主键列和另一列,用于使用外键链接两个表。

create table t1(a number not null primary key,b number);
                
create table t2 ( c number,d number not null primary key);
                  
alter table t1 add foreign key (b) references t2(d);         
alter table t2 add foreign key (c) references t1(a);

现在,当我尝试在任何一个表中插入值时,出现如下错误

ORA-02291:违反完整性约束(sql_KVQVOPFDDGLIGJGJSPOQZZIPN.SYS_C0049615414) - 未找到父键 ORA-06512:在“SYS.DBMS_sql”,第 1721 行

如何一次在表 t1 的两列中插入数据?

解决方法

约束应该被创建为deferrable initially deferred,否则它将不起作用,因为一个表引用另一个表,反之亦然。在不支持延迟约束的 Oracle 数据库版本中,您应该删除外键约束,插入行(注意不会违反外键),然后加强这些约束。

所以:

SQL> create table t1(a number not null primary key,2                  b number);

Table created.

SQL> create table t2 ( c number,2                    d number not null primary key);

Table created.

SQL> alter table t1 add constraint fk12 foreign key (b)
  2  references t2(d) deferrable initially deferred;

Table altered.

SQL> alter table t2 add constraint fk21 foreign key (c)
  2  references t1(a) deferrable initially deferred;

Table altered.

SQL>

测试:当您COMMIT时检查参照完整性:

SQL> insert into t1 (a,b) values (1,2);

1 row created.

SQL> insert into t2 (c,d) values (1,2);

1 row created.

SQL> commit;

Commit complete.

SQL>

如果您输入无效组合(违反参照完整性的值),您将不会在 insert 上被阻止,而是在 COMMIT 上被阻止(正如我已经说过的):

SQL> insert into t1 (a,b) values (5,6);

1 row created.

SQL> insert into t2 (c,d) values (9,9);

1 row created.

SQL> commit;
commit
*
ERROR at line 1:
ORA-02091: transaction rolled back
ORA-02291: integrity constraint (SCOTT.FK12) violated - parent key not found


SQL>