10

私は最近MySQL自体に出会い、MySQLの複合主キーのトピック、特にそれがどのように役立つか、そしてこのサイトからの長所と短所は何ですか?

私はそれで遊びたかったので、この方法で3つのテーブルを作成しました。

CREATE TABLE person(
    personId INT(11) NOT NULL,
    personName VARCHAR(20) NOT NULL,
    PRIMARY KEY(personId)
)

CREATE TABLE language(
    languageId INT(11) NOT NULL,
    languageName VARCHAR(20) NOT NULL,
    PRIMARY KEY(personId)
)

CREATE TABLE personLanguage(
    personId INT(11) NOT NULL,
    languageId INT(11) NOT NULL,
    description VARCHAR(20) NOT NULL,
    PRIMARY KEY(personId, languageId),
    FOREIGN KEY (personId) REFERENCES person(personId) ON UPDATE CASCADE ON DELETE CASCADE,
    FOREIGN KEY (languageId) REFERENCES language(languageId) ON UPDATE CASCADE ON DELETE CASCADE
)

人と言語のテーブルにデータを挿入できます-簡単に言えば、私の質問は次のとおりです。

  1. personLanguageテーブルの場合、説明列のみを挿入する必要がありますが、他の列は自動的に参照されますか、それとも他の2つの列の値もpersonLanguageテーブルに挿入する必要がありますか?

  2. 他の2つのテーブルのデータが挿入されるとすぐに、personLanguageテーブルのpersonIdとlanguageIdを自動的に更新する可能性はありますか? personLanguageテーブルの2つの列

  3. 3つのテーブルに関連するデータを取得する方法。たとえば、personId = 1の人が話す言語を知る必要がありますか?結合を使用した簡単なクエリでもありますか、それとも複合主キーを使用しているので他の方法がありますか?

頭を悩ませている質問がたくさんあり、複合主キーを使用することの正確な長所と短所を確認するための実用的な例を実際に見つけることができませんでした。誰かが私の例を使ってこれを詳しく説明できれば、本当に役に立ちます。

ある種の基本的な質問をしたことは知っていますが、意味のない質問もありますが、このトピックに少し気を配ってください。

4

2 に答える 2

3

personLanguageテーブルの場合、説明列のみを挿入する必要がありますが、他の列は自動的に参照されますか、それとも他の2つの列の値もpersonLanguageテーブルに挿入する必要がありますか?

はい、完全に有効にするには、3つの列すべてを挿入する必要があります。そうしないと、DBは、このレコードを結び付けようとしている人または言語を認識できません。

他の2つのテーブルのデータが挿入されるとすぐに、personLanguageテーブルのpersonIdとlanguageIdを自動的に更新する可能性はありますか? personLanguageテーブルの2つの列

挿入トリガーを介してこれを行うことはできますが、意味がない場合があります。それで、あなたがちょうど新しい言語を入力したとしましょう-フランス語を言います。既存のユーザーはフランス語で情報を取得したくない場合があるため、personLanguageテーブルに値を入力する必要はまったくありません。同じ状況は、新しい人を作成する場合です。あなたは多くの言語を持っているかもしれません。ほとんどの人はほとんどの言語を話せないので、繰り返しになりますが、personLanguageテーブルにレコードを自動的に入力することは望ましくありません。

個人および言語での記録の更新に関しては、KEYSは変更されるべきではありません。これがあなたがこのようなことをする理由です。ボブまたはアリスにpersonIdが割り当てられると、それらはそのIDになります。フランス語にlangaugeIdが割り当てられると、それは常にそのlanguageIdである必要があります。

3つのテーブルに関連するデータを取得する方法。たとえば、personId = 1の人が話す言語を知る必要がありますか?結合を使用した簡単なクエリでもありますか、それとも複合主キーを使用しているので他の方法がありますか?

さて、これは難しい質問です。personId = 1が話すすべての言語を取得しようとしている場合、結合は非常に簡単です。

select pl.personId, l.languageId, l.languageName 
  from personLanguage pl
    join language l on l.languageId = pl.languageId
    where pl.personId = 1

その人がpersonLanguagesを定義していない可能性があるため、その人とどの言語を通信する必要があるかを理解しようとすると、さらに複雑になります。null値を受け入れることができる場合は、外部結合を使用できますが、単一の言語のみを返すようにクエリを定義する必要があります。

于 2012-09-20T14:39:35.963 に答える
2
  1. personLanguageテーブルの場合、説明列のみを挿入する必要がありますが、他の列は自動的に参照されますか、それとも他の2つの列の値もpersonLanguageテーブルに挿入する必要がありますか?

    personLanguage参照されるテーブルに既存のキーがある場合にのみ、に値を挿入できます。つまり、に値を挿入する前に、データを入力する必要がpersonあります。ただし、有能なフィールドがある場合はこれを行うことができますが、一意の複合キーに違反します。languagepersonLanguageNULL

  2. 他の2つのテーブルのデータが挿入されるとすぐに、personLanguageテーブルのpersonIdとlanguageIdを自動的に更新する可能性はありますか? personLanguageテーブルの2つの列

    指定した制約(ON UPDATE CASCADE)は、いずれかの参照値に変更があった場合、personまたはlanguageでそれらの値が自動的に更新されることを意味しますpersonLanguagePRIMARY KEYただし、の制約に違反することはできませんpersonLanguage

  3. 3つのテーブルに関連するデータを取得する方法。たとえば、personId = 1の人が話す言語を知る必要がありますか?結合を使用した簡単なクエリでもありますか、それとも複合主キーを使用しているので他の方法がありますか?

    これは基本的な例であるため、実際には必要ありません。拡張形式では、明示的なJOINsを使用してテーブル間でデータをフェッチできます。

もう少し考えて...

複合キーは通常、タプル(またはセット)での参照に使用されます。これは、に複合キー()がある場合、これはの複合キー(col1, col2)を参照table1することを意味します。col1, col2table2

于 2012-09-20T14:35:09.227 に答える