-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

テーブルにはすでに重複した値があり、recipid 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 に答える