任何一个表上都必须存在外键

q0qdq0h2  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(382)

我正在尝试让以下场景工作:
我有三张table,其中一张( IncidentDetail )是保存另外两个的事件信息( Incident 以及 PendIncident ). 我想要那个 IncidentDetail 表中引用事件 Incident ,或 PendIncident 所以它可以存在于任何一个地方。如何设置约束?
表1- Incident :

+--------------------+
| IncidentNbr | Desc |
+--------------------+

表2- PendIncident :

+------------------------+
| PendIncidentNbr | Desc |
+------------------------+

表3- IncidentDetail :

+-----------------------+
| IncidentNbr | Details |
+-----------------------+

这个 IncidentDetail 表将具有fk约束,以便 IncidentDetail.IncidentNbr 需要在 Incident.IncidentNbr 列或 PendIncident.PendIncidentNbr 列。
是否可以对引用到两个不同表的单个列设置fk约束,或者我需要第二个约束 PendIncidentNbr 中的列 IncidentDetail 具有自己的fk约束的表 PendIncident.PendIncidentNbr ?
这足以确保 IncidentDetail 表是否至少满足一个fk约束?
我可以想到的另一种方法是将fk约束全部删除,并使用check约束,其中 IncidentDetail.IncidentNbr 列或 IncidentDetail.PendIncidentNbr 列有一个值。

bvuwiixz

bvuwiixz1#

您可以在引用到两个不同表的单个列上设置fk约束,但它不适用于您的用例。
由于incidentnbr在任意给定的时间点存在于incident表或pendincident表中,因此在incidentdetail表中具有两个fk约束将在您尝试在此子表中插入记录时失败。由于事件存在于一个父表中,而不存在于另一个父表中,因此它将抛出完整性约束冲突错误w.r.t.second fk。
对于这种情况,使用check约束是可行的解决方案。
快速参考的代码段-

Create table table_a(col_a number primary key);
Create table table_b(col_b number primary key);
Create table table_c(col_c number);

ALTER TABLE table_c
ADD CONSTRAINT fk_c_a
  FOREIGN KEY (col_c)
  REFERENCES table_a(col_a);

ALTER TABLE table_c
ADD CONSTRAINT fk_c_b
  FOREIGN KEY (col_c)
  REFERENCES table_b(col_b);

Insert into table_a values(100);
Insert into table_b values(200);
Insert into table_c values(100); —-This statement will throw integrity constraint violation error
yzuktlbb

yzuktlbb2#

不,外键只能引用一个父表。
您可能需要在incident\u detail中有两个单独的列,每个列都有自己的fk,或者将incident和pendincident合并到一个带有类型或状态列的表中。
您发现自己有一个列似乎引用了两个父表中的任何一个,这一事实向我表明,在不同的处理状态下,它们可能真的是同一件事。

相关问题