外键必须存在于 table

Foreign Key has to exist on either table

我正在尝试让以下场景起作用:

我有三个table,其中一个(IncidentDetail)是保存另外两个(IncidentPendIncident)的事件信息。我希望 IncidentDetail table 引用 IncidentPendIncident table 中的事件,以便它可以存在于任何一个地方。我将如何设置约束?

Table 1 - Incident:

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

Table 2 - PendIncident:

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

Table 3 - IncidentDetail:

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

IncidentDetail table 将具有 FK 约束,因此 IncidentDetail.IncidentNbr 需要在 Incident.IncidentNbr 列或 PendIncident.PendIncidentNbr栏目。

是否可以对引用两个不同 table 的单个列设置 FK 约束,或者我是否需要 IncidentDetail [=51] 中的第二个 PendIncidentNbr 列=] 有自己的 FK 约束 PendIncident.PendIncidentNbr?

是否足以确保 IncidentDetail table 至少满足 FK 约束之一?

我能想到的另一种方法是一起删除 FK 约束并使用检查约束,其中 IncidentDetail.IncidentNbr 列或 IncidentDetail.PendIncidentNbr 列有一个值。

您可以对引用两个不同 table 的单个列设置 FK 约束,但这不适用于您的用例。

由于事件 Nbr 在任何给定时间点都存在于事件 table 或 PendIncident table 中,因此一旦您尝试在 IncidentDetail table 中设置两个 FK 约束就会失败在此childtable中插入一条记录。由于事件存在于一个 parent table 而不是另一个,它将引发完整性约束违规错误 w.r.t。第二个 FK.

对于这种情况,使用检查约束可能是一个可行的解决方案。

供快速参考的代码片段 -

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

不可以,一个外键只能引用一个父项table。

您将需要 INCIDENT_DETAIL 中的两个单独的列,每个列都有自己的 FK,或者将 INCIDENT 和 PENDINCIDENT 合并为一个 table 并带有类型或状态列。

您发现自己只有一个列似乎引用两个父 table 中的任何一个这一事实向我表明,也许它们在不同的处理状态下确实是同一件事。