我正在尝试让以下场景工作:
我有三张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
列有一个值。
2条答案
按热度按时间bvuwiixz1#
您可以在引用到两个不同表的单个列上设置fk约束,但它不适用于您的用例。
由于incidentnbr在任意给定的时间点存在于incident表或pendincident表中,因此在incidentdetail表中具有两个fk约束将在您尝试在此子表中插入记录时失败。由于事件存在于一个父表中,而不存在于另一个父表中,因此它将抛出完整性约束冲突错误w.r.t.second fk。
对于这种情况,使用check约束是可行的解决方案。
快速参考的代码段-
yzuktlbb2#
不,外键只能引用一个父表。
您可能需要在incident\u detail中有两个单独的列,每个列都有自己的fk,或者将incident和pendincident合并到一个带有类型或状态列的表中。
您发现自己有一个列似乎引用了两个父表中的任何一个,这一事实向我表明,在不同的处理状态下,它们可能真的是同一件事。