2012-02-08 7 views
0

これは一部の人にとっては本当に簡単な問題かもしれませんが、わかりにくいです。これはどのような鍵ですか?

シナリオ: 私は学校のデータベースで作業しています。 私はクラスを「subject_class」と呼ばれるサブジェクトに関連付けるテーブルを持っています。

クラスは複数のサブジェクトの一部であり、サブジェクトは複数のクラスを含むことができます。だから私が理解していることから、これはテーブル内の多対多の関係です。

データベースがどのように見えるかの例:

subject_id   class_id 
    1     14 
    1     15 
    2     14 
    *1    *14 

を見てわかるように、同じデータが(アスタリスクで上に示す)が複数回表に入力することができます。私はこれが起こるのをやめてほしい。私の質問は、これはどんな種類の鍵でしょうか?なぜ?問題の発生をどうやって止めることができますか?

これは意味があると思いますが、私に知らせてください、私は詳細を提供します。

ありがとうございます。

+0

これはどのような種類のデータベースですか? MySQL? –

答えて

3

あなたは重複を防ぐためにsubject_idとCLASS_ID上で一意のキーを持っているしたいと思います。しかし、アプリケーションでは、次のいずれかを実行できることを確認する必要があります。既に存在する値の組み合わせを挿入しようとしたときにスローされたエラーを処理し、最初に重複を送信しないようにします。

また、後続の挿入が既存のエントリを上書きするようにするには、データベースソフトウェアがON DUPLICATE KEY UPDATEを処理できるかどうかを調べる必要があります。

0

ほんとうに必要なのは、どちらのカラムにもUNIQUEが適用されていることです。一般的な流れは次のとおりです。アプリケーションは、アクションの前に検証せずにリレーションを保存しようとし、データベースの応答を待ちます。複製の場合、インサートはエラーを返します。これはアプリケーションでさらに処理する必要があります。

+0

彼は、両方の列の2つの行が同じでない限り、各列が複数のエントリを持つことができるようにします。だから、(1,2)(1,3)(2,4)の(科目、クラス)を持つことはOKですが、(1,2)を2回持つことはできません。 – Tim

+0

@Timとthatsには、2つの列に* 1つの*固有のキーが適用されている理由があります。 –

+0

申し訳ありませんが、間違っています。あなたはそれぞれの列がユニークでなければならないと思った。 – Tim

-1

両方のフィールドにUNIQUEを追加します。

ALTER TABLE `table` ADD UNIQUE ( `subject_id` , `class_id`) ; 
+0

これで一意性は変わりません! –

0

あなたは両方の行にまたがる、一意のキーをしたい:この方法では、両方の列は、は、非固有のデータを持っていますが、あなたはでそれを検証している場合ではない組み合わせで

ALTER TABLE subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
0

より良いことができます使用しているアプリケーションプログラミング言語。データベースへの挿入を更新する前に、そのようなチェックを適用します。

データベースレベルでは、複合ユニークキーを使用できます。行を一意に識別するために使用します。

alter table subject_class ADD UNIQUE INDEX sanity (subject_id, class_id); 
+0

これは、同期要求も処理しません。 –

+0

更新された回答を参照してください。 –

0

は、二つのフィールド

ALTER TABLE subject_class ADD PRIMARY KEY (subject_id, class_id) 

間で主キーを作成しますが、あなたは、インデックスを追加することができます前に、重複を削除する必要があります。

関連する問題