问题描述
我正在创建两个表,每个表都有一个主键列和另一列,用于使用外键链接两个表。
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>