我的食谱表结构如下:
product2recipe
id | productid | recipeid
我想消除重复值的插入。基本上配方可以包含1个或更多产品。所以它看起来像这样:
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
然后它应该提交,因为这是一个独特的组合。
如何以最佳方式查询我的表格?我担心它可能会使我的数据库服务器失速,因为它可能有很多组合。
答案 0 :(得分:3)
您提供的示例确实告诉我们您想要什么,因为这些记录不存在于表格中。
但无论如何,这是一种对表格中的复合列强制执行UNIQUE
约束的方法,
ALTER TABLE product2recipe ADD CONSTRAINT tb_uq UNIQUE(productid, recipeid)
在上面的demontration链接中取消注释ALTER TABLE
语句,看看会发生什么
答案 1 :(得分:0)
鉴于一组已知的“新”食谱产品,我建议运行以下查询:
select recipeid
from product2recipe
group by recipeid
having count(distinct productid) =
count(distinct case when productid in (?,?,...) then productid end)
- 任何返回的食谱都将与“新”食谱具有相同的产品组合;然后应该对您的应用程序进行编程以拒绝此类“新”配方。