Oracle 11g: 混淆约束

3
我有一个引用约束,即使被引用的值确实在被引用的表中,它也无法启用。我仔细检查了约束脚本和两个表中的拼写。
当我尝试启用约束时,返回的错误是“找不到父键”。我物理比较了数据,并且所需的值确实在被引用的表中。
被引用的列设置为主键,并已启用。
涉及的过程涉及通过 dblink 从另一个模式/数据库进行的数据加载/传输。
在数据传输的源表中,确实启用了类似的约束。
由于数据敏感性,实际上不能发布数据,只是希望能够得到更多要检查的想法。
任何想法或建议都将不胜感激。
约束代码:
  ALTER TABLE SR2.LOG ADD (
  CONSTRAINT FF1 
   FOREIGN KEY (NOTCH_ID) 
   REFERENCES SR2.NOTCH (ID)
    DISABLE NOVALIDATE);

用户在您验证外键时是否会在任何父表或子表中插入数据?这是在生产数据库上完成的吗? - Felipe Moreno
源表是生产表,但引用的值可以在引用表中看到。 - Michelle Daniel
也许用户进程插入数据的顺序可能是原因。例如,首先在子表中插入。这只是一个想法。您尝试过EXCEPTIONS子句吗? - Felipe Moreno
1个回答

5

针对此问题,Oracle 提供了一种内置解决方案。您可以使用 ALTER TABLE 的 EXCEPTIONS 子句:

  -- parent table
  create table t1 (col1 number primary key);

  insert into t1 values (1);
  insert into t1 values (2);
  insert into t1 values (3);
  commit;

  -- child table
  create table t2 (col1 number);

  insert into t2 values (1);
  insert into t2 values (2);
  insert into t2 values (3);
  insert into t2 values (4); -- bad data
  commit;

  -- You create a table for the exceptions
  create table excepts  (row_id rowid,
                         owner varchar2(30),
                         table_name varchar2(30),
                         constraint varchar2(30));

  -- you still get error
  alter table t2 add constraint f2 foreign key (col1) references t1
  exceptions into excepts ;

  -- but bad data will be here
  -- please notice its 'ROW_ID' from the second table
  select t2.*
  from  t2,
        excepts 
  where t2.rowid = excepts.row_id;

您仍然可以在ENABLE VALIDATE语句中使用它: alter table t2 enable validate constraint f2 exceptions into excepts; - Felipe Moreno
总有新东西要学习。有没有办法在“alter table”期间防止错误?你知道哪些RDBMS支持类似的语法吗? - Beryllium
@Beryllium 这个错误是为了让你知道出了问题。我只使用Oracle,不知道其他关系型数据库管理系统是否有这个功能。 - Felipe Moreno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接