【问题标题】:How to add Oracle constraint to below tables如何将 Oracle 约束添加到下表
【发布时间】:2013-01-04 13:35:57
【问题描述】:

我有三张桌子:

一个 {op_id, op_name, .}

B {b_id, op_id, supplier_id, .}

C {c_id, op_id, op_id2, supplier_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 存在关系记录,那么它不应该允许我删除。是否可以通过约束?

【问题讨论】:

    标签: oracle foreign-keys


    【解决方案1】:

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

    表 A op_id 是主键, 在表 B b_id 是主键 并且在表 C 中 c_id 是主键

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

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

    希望这会有所帮助。

    【讨论】:

    • 感谢您的回复。我们可以通过参照完整性约束来实现这一点吗?
    • 告诉我一件事——如果一个 op_id 被插入到表 B 中,那么它是否会被插入到表 C 中
    • 没有B表和C表是独立的,但是表C维护了op_id+supplier_id的关系细节。
    • 那么没有其他方法,您可以实现的唯一方法是通过我指定的触发器,而另一种方法是编写触发器before insert 检查 opid + supplier_id 的组合是否为允许与否
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-02-16
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-11
      • 2019-06-19
      相关资源
      最近更新 更多