没有找到Oracle 10g的父密钥

时间:2014-03-11 10:41:04

标签: oracle

我有两张桌子:

SQL> desc SEGMENT
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 INDIP                                     NOT NULL VARCHAR2(11)
 NOMSEGMENT                                NOT NULL VARCHAR2(20)
 ETAGE  

SQL> desc POSTE
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 NPOSTE                                    NOT NULL VARCHAR2(7)
 NOMPOSTE                                  NOT NULL VARCHAR2(20)
 INDIP                                              VARCHAR2(11)
 AD                                                 VARCHAR2(3)
 TYPEPOSTE                                          VARCHAR2(9)
 NSALLE                                             VARCHAR2(7)

我想添加一个约束如下:

 ALTER TABLE "POSTE" ADD CONSTRAINT "FK_POSTE_SEGMENT" FOREIGN KEY ("INDIP") REFERENCES "SEGMENT" ("INDIP") ENABLE;

但我收到此错误消息:

  

第1行的错误:ORA-02298:无法验证(AIMAD.FK_POSTE_SEGMENT) -
  未找到父键

我该如何解决?

1 个答案:

答案 0 :(得分:0)

您应该检查哪些POSTE表不包含INDIP列中SEGMENT表的INDIP列中不存在的值。

喜欢

SQL> create table t (x int primary key);


SQL> insert into t values(1);

SQL> create table t_c (x int);


SQL> insert into t_c values(1);


SQL> insert into t_c values(2);


SQL> commit;


SQL> alter table t_c add constraint t_c_x foreign key(x)
  2  references t(x);
alter table t_c add constraint t_c_x foreign key(x)
                               *

ORA-02298: cannot validate (SCOTT.T_C_X) - parent key not found 


SQL> select * from t_c where not exists (select *
  2  from t where t.x = t_c.x);

                      X                                                         
-----------------------                                                         
                      2     

Oracle还提供了在NOVALIDATE状态下创建约束的功能,这可以防止Oracle在创建约束期间检查数据:

SQL> alter table t_c add constraint t_c_x foreign key(x)
  2  references t(x) enable novalidate;

Table altered.

但这会产生不良副作用,因为两个表中的数据不一致。