我有三张桌子:
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存在关系记录,那么它不应该允许我删除。是否可以通过约束?
答案 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中。