MySQL 外部キー (FOREIGN KEY) の使用例の詳細な説明

MySQL 外部キー (FOREIGN KEY) の使用例の詳細な説明

はじめに: すべてのデータを 1 つのテーブルに保存することのデメリット

  1. 表の構成構造は複雑で不明瞭である
  2. スペースの無駄
  3. スケーラビリティが非常に低い

上記の問題を解決するには、データを格納するための複数のテーブルが必要です。

テーブル内のレコード間の関係には、1 対多、多対多、1 対 1 の 3 種類があります。

テーブル間の関係を扱うには、FOREIGN KEY を使用します。

多対1の関係:

テーブル間の関係を見つけるルーチン

例: 従業員テーブル: emp テーブル 部門: dep テーブル

パート1:

  1. まず、テーブルempの観点から
  2. emp テーブル内の複数のレコードが dep テーブル内の 1 つのレコードに対応しているかどうかを確認します。
  3. 翻訳2の意味:
    左のテーブル emp に複数のレコードがある場合 ==> 複数の従業員、右のテーブル dep に 1 つのレコードがある場合 ==> 1 つの部門 最終的な翻訳結果: 複数の従業員が 1 つの部門に所属できますか?

はいの場合は、パート2に進む必要があります

パート2:

  1. テーブル依存関係の観点から
  2. dep テーブル内の複数のレコードが emp テーブル内の 1 つのレコードに対応しているかどうかを確認します。
  3. 翻訳2の意味:
    右のテーブルに複数のレコード dep ==> 複数の部門 左のテーブルに 1 つのレコード emp ==> 1 人の従業員

最終的な翻訳結果: 複数の部門に同じ従業員を含めることができますか? そうでない場合、emp と dep の関係は一方向の多対 1 のみであると判断できます。 これを実現するにはどうすればよいでしょうか?
このとき、外部キーを使用できます。emp テーブルに dep_id フィールドを追加します。このフィールドは、dep テーブルの id フィールドを指します。

外部キーはどのような効果をもたらすのでしょうか?

制約1: テーブルを作成するときは、まず関連するテーブル dep を作成してから、関連するテーブル emp を作成する必要があります。

テーブル dep を作成します(
    id int 主キー auto_increment,
    dep_name char(10)、
    dep_comment 文字(60)
);
 
テーブルempを作成します(
    id int 主キー auto_increment,
    名前 char(16)、
    性別 enum('男性','女性') NULL ではない デフォルト '男性'、
    dep_id int,
    外部キー(dep_id)はdep(id)を参照します
);

制約2: レコードを挿入する場合、まず関連するテーブル dep を挿入してから、関連するテーブル emp を挿入する必要があります。

dep(dep_name,dep_comment) の値に挿入する
(「教育部門」、「学生の指導とコースの指導」)、
(「広報部」、「広報危機への対応」)
(「技術部」、「開発プロジェクト、研究技術」)
 
emp(name,gender,dep_id) の値に挿入する
('monicx0','男性',1),
('monicx1','男性',2),
('monicx2','男性',1),
('monicx3','男性',1),
('リリ','女性',3);

制約 3: 更新と削除の両方において、関連付けられているものと関連付けられているものの関係を考慮する必要があります。

解決:

1. 最初に関連テーブルempを削除し、次に関連テーブルdepを削除して再構築の準備をします。

2. 再構築:新しい機能の追加、同期更新、同期削除

テーブル dep を作成します(
    id int 主キー auto_increment,
    dep_name char(10)、
    dep_comment 文字(60)
);
 
テーブルempを作成します(
    id int 主キー auto_increment,
    名前 char(16)、
    性別 enum('男性','女性') NULL ではない デフォルト '男性'、
    dep_id int,
    外部キー(dep_id)はdep(id)を参照します
    更新カスケード
    削除カスケード
);

これを修正します:

結果は次のとおりです。

今すぐ削除します:

結果は次のとおりです。

多対多の関係:

2 つのテーブルのレコード間には双方向の多対 1 の関係があり、これを多対多の関係と呼びます。

どうやってそれを達成するのでしょうか?

左側のテーブルの ID であるフィールド外部キーと、右側のテーブルの ID であるフィールド外部キーを持つ 3 番目のテーブルを作成します。

テーブル作成者(
    id int 主キー auto_increment,
    名前文字(16)
);
 
テーブルブックを作成(
    id int 主キー auto_increment,
    bname char(16)、
    価格 int
);
 
著者(名前)の値に挿入
('monicx1')、
('monicx2')、
('モニックx3')
;
book(bname,price)の値に挿入する
(『入り口から墓場までのパイソン』、200)、
(『入所から死に至るまでのリウンクス』400)
(『ジャワの入り口から墓場まで』、300)、
(『PHP 入場から墓場まで』、100)
;
#3番目のテーブルを作成します:
テーブルauthor2bookを作成します(
    id int 主キー auto_increment,
    著者ID int,
    書籍ID int,
    外部キー(author_id)はauthor(id)を参照します。
    更新カスケード
    削除カスケードでは、
    外部キー(book_id)はbook(id)を参照します。
    更新カスケード
    削除カスケード
);
 
author2book(author_id,book_id) の値を挿入する
(1,3)
(1,4)
(2,2)
(2,4)
(3,1)
(3,2)

1 対 1 の関係では、左側のテーブルのレコードは右側のテーブルのレコードに一意に対応し、その逆も同様です。

顧客テーブルを作成(
    id int 主キー auto_increment,
    名前 char(20) が null ではない、
    qq char(10) ヌルではない、
    電話番号(16)がnullでない
);
 
テーブル学生を作成(
    id int 主キー auto_increment,
    class_name char(20) が null ではない、
    customer_id int unique, #このフィールドは一意である必要があります。外部キー (customer_id) は顧客 (id) を参照します。#この時点で、外部キーフィールドは一意であることが保証されている必要があります。
    削除カスケード
    更新カスケード
);

MySQL 外部キー (FOREIGN KEY) の使用に関する詳細な事例については、これで終了です。MySQL 外部キー (FOREIGN KEY) の使用に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL はどのようにしてマルチバージョンの同時実行性を実現するのでしょうか?
  • MySQLフィルタリングレプリケーションのアイデアの詳細な説明
  • MySQL のストアド プロシージャを使用して 100 万件のレコードをすばやく生成する方法
  • Pythonインターフェース自動化はpymysqlデータベース操作プロセスを簡単に分析します
  • MySQL トランザクション制御フローと ACID 特性
  • MySQLはストアドプロシージャを使用して数百万のデータを素早く追加します。サンプルコード
  • MySQL で重複時間を削除して時間差を計算する実装
  • MySQL データベースでは、datetime、bigint、timestamp を使用して時間の選択を表します。時間を保存するのに最も効率的なのはどれですか?
  • MySQL グローバルロックとテーブルレベルロックの具体的な使用法
  • Redo ログと Undo ログに基づく MySQL クラッシュ回復の分析

<<:  レスポンシブ Web デザインが価値のない 5 つの理由

>>:  Docker 経由で wsl の tar ファイルを作成する方法

推薦する

Vue-Routerのインストールプロセスと原理の詳細

目次1. フロントエンドルーティングの実装原則2. vue-Routerの基本的な使い方2.1. イ...

iframe が HTML 内のページにジャンプするのを防ぎ、iframe を使用して WeChat Web バージョンをページに埋め込む方法

私は、WinForm と HTML5 を組み合わせた小さなものを作りたいだけなのですが、突然、そこに...

MySQL inndbジョイントインデックスを正しく使用する方法を徹底的に理解するためのケーススタディ

最近確認された5件のデータを照会するビジネスがあります。 `id`、`title` を選択 `th_...

Ubuntu 20.04でAliソースを変更する方法

なお、この記事では、単に 20.04 ソースに変更する方法を説明するのではなく、20.04 に基づい...

Javascript サンプル プロジェクトでの虫眼鏡効果の実装プロセス

目次序文事例: JD.com の虫眼鏡効果の模倣オフセットシリーズクライアントシリーズスクロールシリ...

Node.jsはMySQLデータベースの実戦記録を追加、削除、変更、チェックします

目次プロジェクトでデータベースを操作する3つのステップデータベースを操作するための具体的な手順1: ...

MySQLの比較演算子正規表現マッチングREGEXPの使用の詳細な説明

1. データを初期化する `test_01` が存在する場合はテーブルを削除します。 テーブル「te...

HTML4とHTML5の違い: 入力にフォーカス実装コードを追加する方法

html4:コードをコピーコードは次のとおりです。 <フォーム> <p>&l...

dockerコンテナは直接実行され、pingを介してパブリックIP操作を取得します。

コンテナを通じてローカル パブリック IP アドレスを取得します。ローカル IP アドレスを使用して...

MySQL GRANT ユーザー認証の実装

承認とは、ユーザーに特定の権限を付与することです。たとえば、新しく作成したユーザーに、すべてのデータ...

きちんとしたHTMLマークアップを使用してページを構築します

インターネットは絶えず進化する有機体です。長期にわたってインターネットの発展に適応できるページを構築...

HTML テーブル マークアップ チュートリアル (41): テーブル ヘッダーの幅と高さの属性 WIDTH、HEIGHT

デフォルトでは、ヘッダーの幅と高さはコンテンツに応じて自動的に調整されます。ヘッダーの幅と高さを手動...

Vueのdiffアルゴリズムについての簡単な説明

目次概要バーチャルドム原理実装プロセスパッチ方式sameVnode関数patchVnode関数upd...

Linuxカーネルマクロcontainer_ofの詳細な分析

1. 前述の通り数年前、Linux ドライバーのコードを読んでいたときにこのマクロを見ました。長い間...

VMware、nmap、burpsuite インストール チュートリアル

目次VMware バープスイート1. 仮想マシンイメージとVMwareのインストールと使用2. 仮想...