如何将Oracle约束添加到下表

时间:2013-01-04 13:35:57

标签: oracle foreign-keys

我有三张桌子:

A {op_id,op_name,。}

B {b_id,op_id,supplier_id,。}

C {c_id,op_id,op_id2,supplier_id,relation,。}

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

2 个答案:

答案 0 :(得分:0)

通常按照下面的指定添加约束

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

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

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

希望这有帮助。

答案 1 :(得分:0)

你的大多数关键限制都相当简单,困难的部分是最后一部分,确保你不能在没有先从C中删除行的情况下从B中删除行。

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