这种情况会起作用吗?
表1
Column1 PK
Column2 FK
表2
Column1 PK
Column2 FK
表2的第2列参考表1的第1列和表1的第2列引用表2的第1列。这是否可行?我想这不会。
答案 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 ),但在这种情况下,问题将出现在数据模型中。说T1
是T2
的父级,同时T2
是T1
的父级是什么意思?这是胡说八道。
此外,这种安排强制执行1:1关系,这是数据模型上的另一个红色(或至少是琥珀色)标志。即使有真正的理由建立1:1的关系,最好还是找出一个明确的父母和一个聪明的孩子。
<强> TL:博士强>
可以做但不应该