【问题标题】:Oracle 11g: Confounding constraintOracle 11g:混淆约束
【发布时间】:2013-06-01 05:50:42
【问题描述】:

我有一个不会启用的引用约束,即使引用的值确实在引用的表中。我仔细检查了约束脚本和两个表中的拼写。

当我尝试启用约束时,返回的错误是“找不到父键”。我物理比较了数据,所需的值确实在引用的表中。

引用的列设置为主键并启用。

所涉及的过程涉及通过 dblink 从另一个模式/数据库加载/传输数据。

在数据传输的源表中,确实启用了类似的约束。

由于数据敏感性,无法真正发布数据,只是希望我能对进一步检查的事情有所了解。

任何想法或建议表示赞赏。

约束代码:

  ALTER TABLE SR2.LOG ADD (
  CONSTRAINT FF1 
   FOREIGN KEY (NOTCH_ID) 
   REFERENCES SR2.NOTCH (ID)
    DISABLE NOVALIDATE);

【问题讨论】:

  • 在您验证 FK 时,用户是否继续在任何父表或子表中插入数据?这是在生产数据库上完成的吗?
  • 源表是生产的,但是在引用的表中可以看到引用的值。
  • 也许用户进程插入数据的顺序可能是原因。首先插入子表之类的东西。不过只是一个想法。您是否尝试过 EXCEPTIONS 子句?

标签: oracle oracle11g


【解决方案1】:

为此有一个 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 ;
  • +1 总有新东西要学。有没有办法防止alter table 期间出现错误?你知道支持类似语法的 RDBMS 吗?
  • @Beryllium 错误是让您知道出了点问题。我只是使用Oracle,我不知道其他RDBMS是否有这个功能。
猜你喜欢
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多