-2

我有一个结构如下的食谱表:

product2recipe
id | productid | recipeid

我想消除重复值的插入。基本上,一个配方可以包含 1 个或多个 productid。所以它看起来像这样:

1 | 1 | 1
2 | 2 | 1
3 | 1 | 2
4 | 5 | 3

如果配方包含类似的值,则用户可以提交新配方,例如:

id | 1 | 4
id | 2 | 4

那么它不应该提交,因为表已经有重复的值,recipeid 1 已经包含 productid 1 和 2。如果是:

id | 1 | 5
id | 3 | 5

然后它应该提交,因为这是一个独特的组合。

如何以最佳方式查询我的表?我担心它可能会停止我的数据库服务器,因为可能有很多组合。

4

2 回答 2

3

您提供的示例确实告诉我们您想要什么,因为这些记录不存在于表中。

但无论如何,这是一种对UNIQUE表中的复合列实施约束的方法,

ALTER TABLE product2recipe ADD CONSTRAINT tb_uq UNIQUE(productid, recipeid)

取消注释ALTER TABLE上面演示链接中的声明,看看会发生什么

于 2013-04-08T05:27:48.617 回答
0

给定一组已知的“新”配方产品,我建议运行以下查询:

select recipeid
from product2recipe
group by recipeid
having count(distinct productid) = 
       count(distinct case when productid in (?,?,...) then productid end)

- 返回的任何配方都将具有与“新”配方相同的产品集;然后,您的应用程序应被编程为拒绝此类“新”配方。

于 2013-04-10T13:58:32.520 回答