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

推薦する

Webフロントエンド開発におけるエラーを見つけるための基本的な考え方

WEB開発は主に2つのインタラクション(B/Sデータ)から構成されますブラウザ: 1html、css...

Linux の PHP に XML 拡張機能をインストールする詳細な手順

PHP Linux に XML 拡張機能をインストールする1. PHPインストールソースパッケージを...

nginx 設定ファイルパスとリソースファイルパスを表示する方法

nginx 設定ファイルのパスを表示する nginx -t 経由nginx -t コマンドの本来の機...

fullpage.js フルスクリーンスクロールの具体的な使い方

1.fullpage.js ダウンロードアドレスhttps://github.com/alvarot...

Jenkins でユーザー ロールの権限を設定する方法

Jenkinsのユーザーロール権限の設定には、ロール戦略プラグインのインストールが必要です。 1.ロ...

検索ボックスと検索ボタンの境界線が重なり合わない問題を解決

今日、Baiduのページで練習していたところ、検索ボックスとボタンの余白とパディングの値が0に設定さ...

MySQL 文字セットの文字化けとその解決方法

序文文字セットは、一連のシンボルとエンコード規則です。Oracle データベースでも MySQL デ...

DockerはホストのMysql操作に接続します

今日、会社のプロジェクトでは docker を設定する必要があります。Windows に正常にインス...

IE8はマルチ互換モードを使用してWebページを正常に表示します

IE8には複数の互換モードがあります。 IE プラットフォームの設計者である Chris Wilso...

Nginx シグナル制御

Nginx の紹介Nginx は、高性能な HTTP およびリバース プロキシ サーバーであり、IM...

Ubuntu 16.04 で MySQL マスター スレーブ同期を設定する方法

準備1. マスターとスレーブのデータベースのバージョンは一致している必要があります2. マスターデー...

VUE + OPENLAYERSがリアルタイムポジショニング機能を実現

目次序文1. ラベルスタイルを定義する2. GeoJSONデータのシミュレーション3. Vercto...

Nginx操作応答ヘッダー情報の実装

前提条件: ヘッダー情報操作をサポートするには、ngx_http_headers_module モジ...

Dockerfile を使用して nginx イメージを構築する例

Dockerfile の紹介Docker は、Dockerfile の内容を読み取ってイメージを自動...

Mysql binlog ログファイルが大きすぎる場合の解決策

目次1. 関連するbinlog設定2. binlogに関する詳細設定2.1 バイナリログモードの変更...