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 を使用する方法

推薦する

Apache Web サーバーを使用して 2 つ以上のサイトを構成する方法

人気があり強力な Apache Web サーバーで 2 つ以上のサイトをホストする方法。前回の記事で...

Nest.js パラメータ検証とカスタム戻りデータ形式の詳細な説明

0x0 パラメータ検証Nest.jsでは、パラメータ検証業務のほとんどをパイプライン方式で実装してい...

Docker が MySQL を作成する説明

1. MySQLイメージをダウンロードするコマンド: docker pull mysql 2. コン...

jsはテーブルドラッグオプションを実装します

この記事の例では、テーブルドラッグオプションを実装するためのjsの具体的なコードを参考までに共有して...

Linux で so または実行可能プログラムの依存ライブラリを表示します

Linux で実行可能プログラムまたは so の依存ライブラリを表示します。 Linux の実行可能...

Ace をベースにした Markdown エディターを共有する

エディターは 2 つのカテゴリに分かれていると思います。1 つは、即時レンダリングを実現するために左...

Windows 10 で MySQL の解凍バージョンをインストールする方法の詳細なグラフィック チュートリアル

MySQL のインストールは、インストール バージョンと解凍バージョンに分かれています。インストール...

MySQL 8.0.15 のインストールと設定方法のグラフィック チュートリアル (Windows 10 X64)

最近私が学んでいるのは MySQL の知識なので、MySQL をインストールすることが非常に重要です...

ブラウザの互換モードでボタン内のテキストが垂直方向に中央揃えにならない問題について簡単に説明します。

XML/HTML コードコンテンツをクリップボードにコピー<ボタンスタイル= "カ...

npm グローバル モジュールのデフォルトのインストール パスを変更するためにノードのインストールをカスタマイズする手順

node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...

ハイパーリンクの表示と開き方

<br />関連記事: ハイパーリンクを表示して開く方法症状<br />ユー...

マウスの尾行効果を実現する JavaScript

マウス効果では、setTimeout を使用して固定時間にノードを生成し、ノードを削除し、生成された...

Nginx のパフォーマンスを向上させるための提案

Web アプリケーションが 1 台のマシンでのみ実行される場合、パフォーマンスを向上させるのは非常に...

Linuxコマンドのファイル上書きとファイル追加の詳細な説明

1. コマンド > と >> の違いコマンド>: ファイルが存在する場合は、...

Uniapp は DingTalk スキャンコード ログイン サンプル コードを実装します

UniappにはDingTalk認証ログインがないため、この記事ではDingTalk QRコードログ...