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 ファイルを作成する方法

推薦する

HTML で点線の境界線を設定する方法

CSSスタイルとHTMLタグ要素を使用するさまざまな HTML タグに点線の境界線を追加するために、...

HTML における iFrame タグの 2 つの使用法

最近、私は「ぶどうコレクション」というプロジェクトに取り組んでいます。簡単に言うと、Budou ペー...

Vue カスタム箇条書きボックス効果 (確認ボックス、プロンプトボックス)

この記事の例では、参考のためにVueカスタムポップアップ効果の具体的なコードを共有しています。具体的...

MySQLのSQL文はインデックスを使用しません

インデックス集約を使用しない MySQL クエリご存知のとおり、インデックスを追加することはクエリ速...

Vueにおけるキーの役割と原理の詳細な説明

目次1. 結論から始めましょう2. キーの役割2.1 例2.2 上記の例を修正する2.3 例を再度修...

CSSはヒントボックス、バブルボックス、三角形を作成します

場合によっては、ページにプロンプ​​ト ボックスやバブル ボックスが必要になることがあります。CSS...

MySQLデータベースの追加、削除、変更操作の詳細な説明

データの挿入テーブル名(列名1、列名2、列名3)の値(値1、値2、値3)に挿入します。ユーザーに(u...

MySQL pt-slave-restart ツールの使い方の紹介

目次MySQL マスター スレーブ レプリケーション環境を設定する場合、マスター データベースとスレ...

CentOS8 システムをベースにした Gitlab を構築するために Docker を使用する詳細なチュートリアル

目次1. Dockerをインストールする2. GitLabをインストールする3. GitLabを初期...

JS でオブジェクトが空オブジェクトかどうかを判断する 5 つの方法

1. jsonオブジェクトをjson文字列に変換し、文字列が「{}」であるかどうかを判断します。 v...

WeChatアプレットがユーザーの移動軌跡を記録

目次設定を追加json 構成レイヤー構成の表示論理層の構成位置追跡をオンにする録音を開始開始座標を決...

JavaScript の一般的なステートメント ループ、判定、文字列から数値

目次1. スイッチ2. whileループ3. Do/Whileループ3. 文字列を数値に変換する1....

ディスクを破壊せずに Linux で dd コマンドを使用する方法

故障したストレージ ドライブからデータを救出する場合でも、アーカイブをリモート ストレージにバックア...

MySQL内部一時テーブルの具体的な使用法

目次連合テーブルの初期化ステートメントの実行連合の結果ユニオンオールグループ化十分なメモリステートメ...

DockerがMySQL構成実装プロセスを開始

目次実際の戦闘プロセスまずは主なコマンドと詳細を一つずつ説明しましょう起動が成功したかどうかを確認す...