SQL 文における複合主キーと結合主キーに関する予備的研究

SQL 文における複合主キーと結合主キーに関する予備的研究

1. 複合主キー

いわゆる複合主キーとは、テーブルの主キーが複数のフィールドで構成され、ビジネス上の意味を持たない自動増分 ID を主キーとして使用しないことを意味します。
例えば

テーブルテストの作成  
(  
  名前varchar(19)、  
  ID番号、  
  値varchar(10)、  
  主キー (名前、ID)  
)

上記の name フィールドと id フィールドの組み合わせは、テスト テーブルの複合主キーです。name フィールドに重複した名前がある可能性があるため、レコードの一意性を確保するために ID フィールドを追加する必要があります。一般的に、主キーのフィールド長と数はできるだけ小さくする必要があります。

ここで疑問が生じます。主キーは唯一のインデックスなのに、なぜテーブルで複数の主キーを作成できるのでしょうか。

実際のところ、「主キーが唯一のインデックスである」という記述は少し曖昧です。例えば、テーブルにIDフィールドを作成し、それを自動増加させて主キーに設定する。これは「主キーは一意のインデックス」であり、IDの自動増加により一意性が確保されるため、問題なく可能です。

この時点で、varchar 型の別のフィールド名を作成し、それを主キーとして設定します。テーブルの複数の行に同じ名前の値を入力できることがわかります。これは、「主キーが唯一のインデックスである」というステートメントに違反していませんか?

だから、「主キーが唯一のインデックスである」というのは曖昧だと言ったのです。 「テーブルに主キーが 1 つしかない場合は、一意のインデックスです。テーブルに主キーが複数ある場合は、複合主キーと呼ばれ、複合主キーが共同で一意のインデックスを保証します。」と正しくは、「テーブルに主キーが 1 つしかない場合は、一意のインデックスです。テーブルに主キーが複数ある場合は、複合主キーと呼ばれ、複合主キーが共同で一意のインデックスを保証します。」です。

自己増分 ID を一意の主キーとして使用できるのに、複合主キーが必要なのはなぜですか?すべてのテーブルに ID フィールドが必要なわけではないからです。たとえば、学生テーブルを作成し、学生を一意に識別できる ID がない場合、どうすればよいでしょうか。学生の名前、年齢、クラスが重複している場合があり、単一のフィールドを使用して一意に識別することはできません。このとき、複数のフィールドを主キーとして設定して、複合主キーを形成できます。これらの複数のフィールドは共同で一意性を識別します。その中で、一部の主キー フィールド値が重複していても問題ありません。複数のレコードのすべての主キー値がまったく同じでない限り、重複とは見なされません。

2. 共同主キー

名前が示すように、複合主キーは複数の主キーの組み合わせです (主キーは原則として一意であるため、一意の値を気にする必要はありません)。

結合主キーの意味: 2 つのフィールド (または複数のフィールド、次の 2 つのフィールドの特定の組み合わせ) を使用してレコードを決定することは、これらの 2 つのフィールドが一意ではなく、個別に繰り返すことができることを意味します。この設定の利点は、繰り返されるフィールドのレコード数を直感的に確認できることです。

簡単な例

主キーAと主キーBは共同主キーを形成する

主キー A と主キー B のデータはまったく同じである場合があります。結合は、主キー A と主キー B によって形成される結合主キーが一意であるという事実にあります。

次の例では、主キー A のデータは 1 であり、主キー B のデータも 1 です。結合主キーは実際には 11 です。この 11 は一意の値であり、一意の値 11 が再び出現することは絶対に許可されません。 (これは多対多の関係です)

主キーAデータ 主キーBデータ

1 1
22
3 3

主キーAと主キーBの結合主キーの最大値は

11
12
13
21
22
23
31
32
33

要約:私の意見では、複合主キーは ID + 名前、ID + 電話などの複数のフィールドで構成されますが、結合主キーは 2 つのテーブルの主題を同時に組み合わせたものです。これが複合主キーとの最大の違いです。

以上が、SQL ステートメントにおける複合主キーと結合主キーの初期調査に関するこの記事の内容のすべてです。皆様のお役に立てれば幸いです。興味のある方は、いくつかの重要な MySQL 変数、MySQL の準備原則の詳細な説明、外部キー制約を持つテーブル データを削除するための MySQL メソッドの紹介などを参照してください。ご質問がある場合は、いつでもメッセージを残していただけます。一緒に話し合い、進歩することができます。

以下もご興味があるかもしれません:
  • SQLで共同主キーを設定する具体的な方法
  • SQL Server で複合主キーを作成する 2 つの方法
  • 主キー、外部キー、複合主キーを作成するための MySQL ステートメント

<<:  Nginx のアクセス制御とパラメータ調整方法

>>:  CocosCreator でカメラトラッキングに cc.follow を使用する方法

推薦する

CSSカスタムプロパティの予備的な理解

現在、CSS プリプロセッサは Web 開発の標準となっています。 プリプロセッサの主な利点の 1 ...

Docker Enterprise Edition を使用して独自のプライベート レジストリ サーバーを構築する

Docker は本当に素晴らしいです。特に、仮想マシンを使用する場合に比べて、Docker イメージ...

HTML テーブル マークアップ チュートリアル (39): ヘッダーの明るい境界線の色属性 BORDERCOLORLIGHT

テーブル ヘッダーでは、明るい境界線の色を個別に定義できます。基本的な構文<TH ボーダーカラ...

el-select のスタイルを変更する方法の詳細な説明: popper-append-to-body と popper-class

elementUI が提供する el-select コンポーネントのスタイルを変更する方法この問題...

MySQL スケジュールされたデータベース バックアップ操作の例

この記事では、MySQL のスケジュールされたデータベース バックアップ操作の例について説明します。...

Linux コマンドラインで電卓を使用する 5 つのコマンド

みなさんこんにちは。私は梁旭です。 Linux を使用するときに、計算を行う必要がある場合があり、そ...

axios を使用してプロジェクト内の複数の繰り返しリクエストをフィルタリングする方法

目次1. はじめに:この場合、通常は 2 つのアプローチがあります。 2. CancelToken ...

mysql5.7.19 winx64 インストールおよび構成方法のグラフィック チュートリアル (win10)

mysql 5.7.19 winx64のインストールチュートリアルは以下のように記録され、みんなと...

Linux で crontab 出力リダイレクトが有効にならない問題の解決方法

質問LINUX では、定期的なタスクは通常、cron デーモン プロセス [ps -ef | gre...

自分のブログを構築しながら学んだこと

<br />ブログを始めて 1 年、私はブログの内外で多くのことを個人的に学びました。ま...

.Net Core を使用して数千万のデータを MySQL にインポートする手順

目次事前準備実施方法: 1. 単一のデータを挿入する2. マージデータ挿入3. MySqlBulkL...

MySQL テーブルの追加、削除、変更、クエリの基本チュートリアル

1. 作成する [テーブル名] (フィールド1、フィールド2、...) 値 (値1、値2、...) ...

セマンティック HTML 構造の利点は何ですか?

1つ: 1.セマンティック タグは単なる HTML であり、CSS にはセマンティクスはありません...

...

mysql は sql ファイルを実行し、エラーを報告します エラー: 不明なストレージ エンジン 'InnoDB' ソリューション

問題を見つける最近、仕事で問題が発生しました。InnoDB タイプの SQL ファイルを実行すると、...