2013-12-11 40 views
1

假设以下Oracle表:甲骨文 - 无法创建所需的外键约束

table master (
    name number(18) not null, 
    version number(5) not null, 
    constraint master_uq unique(name,version) 
) 

table child1 (
    master_name not null, 
    .... 
) 

table child2 (
    master_name not null, 
    .... 
) 
. 
. 
. 
table childN (
    master_name not null, 
    .... 
) 

在childX表的列master_name指主表的名称列。

的规则是:

  • 在主表中的每个名字都保证有一排 版本= 1
  • 每名在主表中可能还会有其他版本的IE。 2,3等
  • childX表引用名称,但不特别感兴趣的版本。

这意味着,在每个tableN以下外键可以在逻辑上创建的,在主表...

foreign key childX_fk(master_name,1) references master(name,version) 

不幸的是,尽管甲骨文的规则,在childX外键引用了一个唯一的列在master中的组合是满足的,Oracle不喜欢childX_fk外键中版本的硬编码1值。

对于能够从各种子表创建外键到主表的参照完整性真的很好,但我看不到一种实现这一点的方法。

有没有人有任何想法可能?

+1

如果子表不关心的版本,有说你是存储在'master'的历史原因表而不是填充一个单独的历史表(即'master_history')? –

+3

你错过了'master_master'表,其中'master_name'是唯一的 –

+0

@Vincent - 谢谢,是的,通常我会去做类似以下的事情: – Pancho

回答

1

您可以使用虚拟列,并用它来参考主:

create table child1 (
    name number(18) not null, 
    alwaysone number generated always as (case when name1 = name1 then 1 end) virtual, 
    foreign key (name,alwaysone) references master(name,version) 
); 
+0

谢谢@Dieter,这是一个非常有趣的方法,它肯定能够工作 - 不需要物理存储冗余数据的开销。如果我没有“解决”这个问题,我可能会采取这种方法,但是由于它仍然会在表中引入噪音,我的第一奖仍然是实现“外键(名称,1)引用...“。也许有一天Oracle会为此做好准备! :O) – Pancho