外键必须存在于 table
Foreign Key has to exist on either table
我正在尝试让以下场景起作用:
我有三个table,其中一个(IncidentDetail
)是保存另外两个(Incident
和PendIncident
)的事件信息。我希望 IncidentDetail
table 引用 Incident
或 PendIncident
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 中的任何一个这一事实向我表明,也许它们在不同的处理状态下确实是同一件事。
我正在尝试让以下场景起作用:
我有三个table,其中一个(IncidentDetail
)是保存另外两个(Incident
和PendIncident
)的事件信息。我希望 IncidentDetail
table 引用 Incident
或 PendIncident
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 中的任何一个这一事实向我表明,也许它们在不同的处理状态下确实是同一件事。