考虑我们有两个表如下:
products: id, name
(PK = id)
product_group1: product_id
(PK = a1_id)
(FK = a1_id REFRENCES a1)
product_group2: product_id
(PK = a1_id)
(FK = a1_id REFRENCES a1)
product_group3: product_id
(PK = a1_id)
(FK = a1_id REFRENCES a1)
问题是,我想设计一个名为approved_products
的表,它只接受group1和group2(而不是group3)的产品。
我该如何设计这样的表格? (我使用的是mysql BTW)
答案 0 :(得分:1)
您想要的是“否定”外键约束,即拒绝此表中存在的产品ID。
然而,这是不可能的。你必须维护这样一个表 - 它只包含第1组和第2组的ID - 你自己;你可以使用触发器。之后,您将使用该表作为外键引用表。
答案 1 :(得分:1)
你应该设计你的表,好像那个“规则”不存在(因为,让我们面对它,它最终可以改变)
然后,您可以使用其他机制来实现此约束。如果要在数据库级别执行此操作,可以在表上使用before insert触发器,或者检查调用验证数据的函数的列。但为什么不在你的申请上做呢?对我来说这似乎是一个商业规则。
答案 2 :(得分:1)
如果不在触发器或应用程序级别插入某些逻辑,则无法使用当前设计解决此问题。 FOREIGN KEY
s不能引用多个表(我理解你的设计每个产品组使用一个表,如果我错了请告诉我)。此外,它们不能包含任何条件逻辑,因此即使您有一个product_groups
表,也无法创建仅允许该表中的G1和G2记录的FOREIGN KEY
。
为了使用标准的关系完整性约束来实现这一点,您需要一个名为approvable_products
的附加表,其中包含第一组或第二组中的product_ids
个产品。< / p>