3

私は2つのテーブルを持っています。1つは「マスター」テーブルで、もう1つは「子」テーブルです。各テーブルには、PRIMARYKEYおよびUNIQUEとして定義されている「ProductNo」という名前のフィールドがあります。テーブル'child'のフィールド'ProductNo'とテーブル'master'の同じフィールドをPRIMARY+UNIQUEと一緒に定義することは可能ですか?

master:
ID | ProductNo

child:
ID | MasterID (FK on master.ID) | ProductNo

Relation >> 1 (master) : n (child) 


example data:
master: 
1 | 1234
2 | 4567

child:
100 | 1 | 3333
101 | 1 | 4444
102 | 2 | 5555
103 | 1 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER`
104 | 2 | 1234 <----- NOT ALLOWED! PRODUCT NO ALREADY EXISTING IN TABLE `MASTER`

'ProductNo'がテーブル'master'にすでに存在する場合は、テーブル'child'の挿入/更新を確認する必要があります。

どうすれば定義できますか?または、これのトリガーを作成する必要がありますか?

TIAマット

4

5 に答える 5

4

いいえ、テーブル間に複合 PK などはありません。

データの一貫性のために、ID が同じ場合は、子からマスターに FK を追加する必要があります。

問題を解決するには、次のようなチェックをトリガーします。

if exists (select 1 from master where prodcutId=new_productId)

良い考えだろう

編集:

実際には、ID を持つ product という名前のテーブルを 1 つだけ使用し、それ自体との関係を持つ masterID フィールドを使用することをお勧めします。今日の方法では、多くの重複データがあり、階層が 2 レベルにとどまっていると確信しています。

于 2012-04-27T09:39:32.317 に答える
2

(元の回答)外部キーが子の主キーを指している場合でも、マスターから子への外部キーを宣言できます。これは 1 対 0 または 1 の関係であり、それほど珍しいことではありません。マスター内の一致する行がすでに挿入されていない限り、子に行が存在することはできませんが、一致する子行がなくても行がマスターに存在することはできます。したがって、挿入はマスター、子の順に行う必要があります。

(質問の編集に照らして編集)ただし、あなたの場合、参照している列は、実際にはどちらのテーブルの主キーでもないように見えますが、別の主/外部キーと問題の列があります2 つのテーブル間で一意である必要があります。これは、いくつかのサンプル データを質問に編集したことで明らかになりました。この場合、両方のテーブルでトリガーを使用して、他のテーブルの存在を確認し、ProductNo が既に存在する場合は挿入/更新を防止することをお勧めします。

于 2012-04-27T09:35:40.663 に答える
1

2つのテーブルが必要ですか?productIDとparentIDを1つだけ保持します。その場合、productIDを主キーおよび自動インクリメントにすることができますが、null以外の(同じテーブルにf.keyedされた)parentIDを持つすべてのものは子アイテムになります。

于 2012-04-27T11:26:26.577 に答える
1

@DavidMが言ったように、それは可能ですが、モデリングの問題がいくつかあるようです。まず、自然の主キーがある場合ProductNo、なぜ代理を定義するのIDでしょうか? もう 1 つは、これら 2 つのテーブルを 1 つのテーブルに結合することです (ほとんどの 1 対 1 のケースでは理にかなっています)。

于 2012-04-27T10:04:20.110 に答える
0

子テーブルに ProductNo という名前の列を追加し、親テーブルに外部キー参照を追加できます。

于 2012-04-27T09:36:20.230 に答える