0

idさて、私は4つの列( 、、、 )event_idを持つテーブルを持っています。ここでgroup_idisbnidはPKでevent_idありgroup_id、FKであり、私の問題は次のとおりです。

isbn番号はそれぞれに固有でevent_idある必要があります。可能であるはずの行と、そうでない行の例をいくつか示します。

 id | event_id | group_id | isbn
 (1,1,1,123) ok 
 (2,1,2,123) ok
 (3,1,4,123) ok
 (4,1,7,1234) ok
 (5,2,8,123) NOT OK, the 'isbn' must be unique for event_id('123' was already used in the first row with event_id = 1)

group_idそれぞれに1回だけ表示されますevent_idが、3つの列で一意の制約を作成すると、を変更するだけでisbnを繰り返すことができます。これは、使用された後は別の列に表示されevent_idません。 (「1」としましょう)は、それぞれに必要な限り同じように繰り返すことができますisbnevent_idevent_idevent_idibsngroup_id

問題を何度か繰り返したのは知っていますが、難しい質問なので、間違った答えが返ってくる可能性を低くしたいと思います。

編集1:@Andomarの回答について、isbnはカーディナリティ(1、n)1-isbn-> n-group_idによってgroup_idに関連付けられている必要があり、回答の構造はそれを行いません

4

2 に答える 2

2

(event_id, isbn)組み合わせを一意に保つには:

create unique index UX_YourTable_EventIsbn on YourTable(event_id, isbn)

コメントによると、isbnごとにイベントを1つだけにしたい場合は、テーブルリレーションを再設計できます。isbn主キーisbnと。というフィールドを持つというテーブルを作成しますevent_id。このように、ISBNには0個または1個のイベントを関連付けることができます。

isbn          isbn primary key, event_id
other_table   id, event_id, group_id

クエリは、テーブル内のイベントのisbnsを検索しisbnます。

于 2012-10-25T17:57:55.200 に答える
2

あなたが説明することevent_idは、に依存している ということisbnです。テーブルを2つに分割して、テーブルを正規化する必要があります。

(修正済み):

これでKeepを削除し、以下の2番目のテーブルに制約をisbn追加します。FOREIGN KEY (event_id, isbn)

id | event_id | group_id | isbn
 1      1          1        123 
 2      1          2        123
 3      1          4        123 
 4      1          7        1234
 5      2          8        123     --- not allowed by the FK constraint

isbnそして、主キーとキー(および、主キーまたは一意キーであるテーブルがある場合は、to tableとto( ?)のUNIQUE (event_id, isbn)2つの外部キー)を使用して新しいテーブルを作成します。event_idEventisbnBookisbn

event_id | isbn
   1        123 
   1       1234 
于 2012-10-25T18:50:24.817 に答える