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の監視プロパティの詳細

目次1.watchは一般的なデータ(数値、文字列、ブール値)の変更を監視します。 1. 数値2. 文...

JS はシンプルなブロック崩しピンボールゲームを実装します

この記事では、ブロック崩しピンボールゲームを実装するためのJSの具体的なコードを参考までに紹介します...

vue-video-player を使用してライブ放送を実現する方法

目次1. vue-video-playerをインストールする2. vue-video-playerを...

MySQL 8.0.12 のインストールと設定方法のグラフィックチュートリアル

MySQL 8.0.12のインストールと設定方法を記録してみんなで共有します。 1. インストール1...

vue.js ルーターのネストされたルート

序文:ルートでは、主要部分は同じでも、基礎となる構造が異なることがあります。たとえば、ホームページに...

MySQL マスタースレーブレプリケーションの実践の詳細説明 - ログポイントに基づくレプリケーション

ログポイントベースのレプリケーション1. マスターデータベースとスレーブデータベースに専用のレプリケ...

ネイティブ JS を使用してタッチスライド監視イベントを実装する方法

序文今日はちょっとしたデモを書きました。左右にスワイプするロジックに関わる部分があります。当初はプラ...

Nginxポーリングアルゴリズムの基本的な実装方法の詳細な説明

ポーリングアルゴリズムの紹介多くの人が職場で nginx を使用しており、その設定に精通しています。...

デザイナーの「職業病」について

デザイナーは世界で最も繊細で感情的な人々だと私はいつも感じています。私がこう言うときに優越感を感じる...

子要素の margin-top によって親要素が移動する問題の解決方法

問題の説明今日、ページ スタイルを変更していたときに、子要素にmargin-top設定したのに、子要...

MySQL 変数の原理と応用例

MySQL ドキュメントでは、MySQL 変数はシステム変数とユーザー変数の 2 つのカテゴリに分類...

DockerでMongoDBコンテナをデプロイする方法

目次Dockerとは展開する1. イメージをプルする2. 画像を表示する3. コンテナを実行する4....

Linux で Grafana をインストールし、InfluxDB モニタリングを追加する方法

Grafana をインストールします。公式 Web サイトでは、直接インストールできる Ubuntu...

MySQLの3値ロジックとNULLの詳細な説明

目次NULLとは何か2種類のNULLなぜ「= NULL」ではなく「IS NULL」と書く必要があるの...

LINUX での IPTABLES ファイアウォールの基本的な使用方法のチュートリアル

序文パブリック IP を持つ本番 VPS の場合、必要なポートのみが開かれ、IP とポートを制御する...