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を使用して天気コンポーネントをロードする方法の詳細な説明

この記事では、Vueを使用して天気コンポーネントをロードする方法を参考までに紹介します。具体的な内容...

vue+elementui+vuex+sessionStorage を使用して履歴タグ メニューを実装するためのサンプル コード

一般的には、左側にメニューがあった後、ページの上部に履歴タブ メニューを追加する必要があります。他の...

Docker可視化ツールPortainerの導入と中国語翻訳

#docker 検索#docker プルポーター1. イメージを取得した後、中国語パッケージをダウン...

MYSQLはUnionを使用して2つのテーブルのデータを結合し、表示します。

UNION演算子の使用union : 2 つ以上の SELECT ステートメントの結果を 1 つの...

Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

1. ワニスの概要1. ワニスの紹介Varnish は、新しいソフトウェア アーキテクチャを使用し、...

MySQLインデックスが失敗するいくつかの状況の詳細な分析

1. 先頭のあいまいクエリではインデックスを使用できません (「%XX」や「%XX%」など)コード値...

FastApi+Vue+LayUIを使用してフロントエンドとバックエンドを分離するサンプルコード

目次序文プロジェクト設計後部フロントエンドプロジェクトを実行する質疑応答序文これまでの API 開発...

Javascript 構造化代入の詳細

目次1. 配列の分解2. オブジェクトの分解3. 不完全な解体4. 分割代入を使用して変数交換を実装...

Vue3の状態管理の使用方法の詳細な説明

目次背景提供/注入共有状態の抽出データを提供するデータの挿入まとめ反応的な共有状態の抽出共有状態の使...

Dockerで同じIDを持つ2つのイメージを削除する

今日 Docker コンテナを作成したとき、誤ってイメージの名前を間違って入力しました。その結果、コ...

スネークゲームのアイデアを実現するためのJavaScript

JavaScriptゲームSnakeの実装アイデア(完全なコード実装)を参考までに説明します。具体...

React 構成 px 変換 rem メソッド

関連する依存関係をインストールするnpm i lib-flexible --save npm i p...

Win7 64 ビット版に MySQL 5.7 をダウンロードしてインストールする際によくある問題の概要

1. 公式ウェブサイトからMySQLをダウンロードします。 これが私たちが探しているものです、win...

EChartsマウスイベント処理方法の詳細な説明

イベントとは、クリック、マウスオーバー、ページの読み込み後にトリガーされる読み込みイベントなど、ユー...

ドロップダウンリスト選択ボックスを実装するJavaScript

この記事の例では、ドロップダウンリスト選択ボックスを実装するためのJavaScriptの具体的なコー...