1

考虑我们有 2 个如下表:

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 顺便说一句)

4

3 回答 3

1

您想要的是“负”外键约束,即拒绝此表中存在的产品 ID。

但是,这是不可能的。您必须自己维护这样一个表 - 仅包含来自第 1 组和第 2 组的 ID;你可以为此使用触发器。之后,您将使用该表作为外键引用表。

于 2012-10-17T12:05:38.890 回答
1

你应该设计你的表格,就像那个“规则”不存在一样(因为,让我们面对现实吧,它最终会改变)

然后,您可以使用其他机制来实现此约束。如果要在数据库级别执行此操作,可以在表上使用插入前触发器,或者对调用验证数据的函数的列进行检查。但是为什么不在你的应用程序上做呢?对我来说,这似乎是一条商业规则。

于 2012-10-17T12:20:54.320 回答
1

如果不在触发器或应用程序级别插入一些逻辑,您将无法使用当前设计解决此问题。 FOREIGN KEYs 不能引用超过一张表(我理解您的设计是每个产品组使用一张表,如果我错了,请告诉我)。此外,它们不能包含任何条件逻辑,因此即使您只有一个product_groups表,也无法创建FOREIGN KEY只允许该表中的 G1 和 G2 记录的表。

为了使用标准的关系完整性约束来实现这一点,您需要一个名为类似的附加表approvable_products,其中包含第一product_ids组或第二组中的那些产品。

于 2012-10-17T14:46:42.113 回答