Oracle - 主键和外键

时间:2014-02-03 21:20:02

标签: oracle data-modeling foreign-key-relationship

这种情况会起作用吗?

表1

Column1 PK
Column2 FK

表2

Column1 PK
Column2 FK

表2的第2列参考表1的第1列和表1的第2列引用表2的第1列。这是否可行?我想这不会。

3 个答案:

答案 0 :(得分:2)

它会,但其中一个FK必须是可以为空的。如果您想要定义1:1关系,为什么不简单地使用共享主键呢? (一张桌子上的PK是另一张桌子PK的FK)

答案 1 :(得分:2)

是的,它适用于延迟约束 例如,可以创建表chicken和表egg,两个表互相引用 将在提交时检查约束。

答案 2 :(得分:1)

外键的默认行为是,在插入子记录之前,具有父键的记录必须存在。即使使用INSERT ALL语句,我们也无法绕过这一点,我们可能希望这可以提供漏洞:

SQL> insert all
  2      into t2 values (c2, c1)
  3      into t1 values (c1, c2)
  4  select 42 as c1, 23 as c2 from dual
  5  /
insert all
*
ERROR at line 1:
ORA-02291: integrity constraint (APC.T2_FK) violated - parent key not found


SQL> 

延迟约束提供了一种解决方法。

SQL> alter table t2 drop constraint t2_fk
  2  /

Table altered.

SQL> alter table t2 add constraint t2_fk foreign key (col_b)
  2      references t1 (col_1) deferrable initially deferred
  3  /

Table altered.


SQL> insert all
  2      into t2 values (c2, c1)
  3      into t1 values (c1, c2)
  4  select 42 as c1, 23 as c2 from dual
  5  /

2 rows created.

SQL> 

在现实生活中,我们应该推迟两个外键,因为我们无法确定插入任何记录对的顺序。

但是,延迟约束的使用始终是一种解决方法;通常它们指向应用程序中的失败( cough Hibernate cough ),但在这种情况下,问题将出现在数据模型中。说T1T2的父级,同时T2T1的父级是什么意思?这是胡说八道。

此外,这种安排强制执行1:1关系,这是数据模型上的另一个红色(或至少是琥珀色)标志。即使有真正的理由建立1:1的关系,最好还是找出一个明确的父母和一个聪明的孩子。

<强> TL:博士

可以做但不应该