0

我有三张桌子:

一个 {op_id, op_name, .}

B {b_id, op_id, 供应商_id, .}

C {c_id,op_id,op_id2,供应商_id,关系,.}

表 B 和 C 的 op_id 是表 A 的外键。表 A 中的 op_id 是主键,表 B 中的 b_id 是主键,表 C 中的 c_id 是主键。在表 B 中,supplier_id 和 op_id 可能有重复记录。现在我想添加约束,以便如果我从表 B 中删除 op_id 的记录,并且如果表 C 中的 op_id 存在关系记录,那么它不应该允许我删除。是否可以通过约束?

4

2 回答 2

0

通常按照您指定的方式添加约束,如下所示

A表op_id为主键,B表b_id为主键,C表c_id为主键

表 B 和 C 的 op_id 是表 A 的外键

对于您指定的最后一个条件,before delete在表 B 上编写触发器并检查表 C 中是否存在 op_id - 如果是,则抛出错误,否则允许它。

希望这可以帮助。

于 2013-01-04T13:41:02.383 回答
0

您的大多数关键约束都是相当微不足道的,困难的部分是最后一部分,确保您不能在不先从 C 中删除行的情况下从 B 中删除行。

一种可能在这里工作的方法是创建一个快速刷新的“提交时”物化视图,它返回 C 中存在但 B 中不存在的唯一 OP_ID 数量的计数。然后您可以向强制计数必须始终为零的视图。此约束将在提交时强制执行,并会阻止您从 B 中删除而不先从 C 中删除(从 B 中删除而 C 中存在匹配记录将违反检查约束,因为物化视图中的计数将大于 0) . 这样做的一个副作用是,如果不先插入 B,就无法插入 C。

于 2013-01-05T16:17:17.533 回答