MySQL 外部キー制約とテーブル関係の概要

MySQL 外部キー制約とテーブル関係の概要

外部キー

前述のように、従業員情報を 1 つのテーブルに保存すると、リソースが大幅に浪費され、重複データが多すぎます。この問題は、すべてのコードを 1 つの py ファイルに記述する場合に似ています。したがって、テーブルを複数のテーブルに分割し、これらの異なるテーブル間の関連付けを確立することができます。関連付けを確立するには、外部キーを使用する必要があります。外部キーも制約の一種です。

テーブルの関係を決定する方法

テーブル間の関係には、1 対多、多対多、1 対 1 の 3 種類があります。では、テーブル間の関係をどのように判断するのでしょうか?

テーブル間の関係を決めるときは、相手の視点で考えることが推奨されています。それはどういう意味ですか?つまり、従業員テーブルと部門テーブルの関係など、2 つのテーブルの観点から考えます。

まず、従業員テーブルの観点から見てみましょう。従業員テーブルの従業員は複数の部署に所属できますか?答えはノーだ

部門テーブルの観点から: 部門テーブル内の部門には複数の従業員が存在する可能性がありますか?答えはイエスです

したがって、従業員テーブルと部門テーブルは一方向の 1 対多であり、従業員テーブルと部門テーブルは 1 対多の関係です。

テーブル関係を作成する方法

テーブル関係を確立する場合、テーブル間の関連付けでは通常、主キー ID が関連付けフィールドとして使用されます。

1対多の関係 - 従業員テーブルと部門テーブル

MySQL の関係には多対 1 の概念はありません。1 対多と多対 1 はどちらも 1 対多です。 1 対多のテーブル リレーションシップを作成するときは、次の点に従う必要があります。

まず、複数側、つまり従業員テーブルに外部キーフィールドが設定されます。

第二に、テーブルを作成するときは、まず関連する当事者、つまり部門テーブルを作成する必要があります。

3 番目に、データを入力するときは、まず関連するテーブルのデータ、つまり部門テーブルのデータを入力する必要があります。

4 番目に、異なるテーブルが関係を確立する場合、カスケード更新と削除が必要です。これは、同期更新と削除とも呼ばれます。カスケード更新と削除が確立されていない場合、2 つのテーブルが相互に関連しているため、関連テーブル内の関連データを削除したり、ID を変更したりすることはできません。

-- 関連テーブル、部門テーブルを作成しますmysql> create table bm(
    id int 主キー auto_increment, 
    bm_name varchar(10)、 
    bm_desc 文字(64)
);
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

mysql> desc bm;
+---------+-------------+------+-----+---------+----------------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+---------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | 自動増分 |
| bm_name | varchar(10) | はい | | NULL | |
| bm_desc | char(64) | はい | | NULL | |
+---------+-------------+------+-----+---------+----------------+
セット内の 3 行 (0.01 秒)

-- 外部キーが配置されているテーブル、従業員テーブルを作成します。mysql> create table yg(
    id int 主キー auto_increment, 
    yg_name varchar(6), 
    bm_id 整数、 
    foreign key(bm_id) は bm(id) を参照します。bm_id は外部キー フィールドであり、bm テーブルの id フィールドに関連付けられていることを示します。on update cascade # cascade update on delete cascade # cascade delete);
クエリは正常、影響を受けた行は 0 行 (0.10 秒)

mysql> desc yg;
+---------+------------+------+-----+---------+----------------+
| フィールド | タイプ | Null | キー | デフォルト | 追加 |
+---------+------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | 自動増分 |
| yg_name | varchar(6) | はい | | NULL | |
| bm_id | int(11) | はい | MUL | NULL | |
+---------+------------+------+-----+---------+----------------+
セット内の 3 行 (0.01 秒)


-- データを挿入mysql> insert into bm (bm_name, bm_desc) values ​​('python', 'Life is short'),('go', 'let us go');
クエリは正常、2 行が影響を受けました (0.00 秒)
記録: 2 重複: 0 警告: 0

mysql> bm から * を選択します。
+----+---------+--------------+
| id | bm_name | bm_desc |
+----+---------+--------------+
| 1 | python | 人生は短い |
| 2 | 行きましょう | 行きましょう |
+----+---------+--------------+
セット内の 2 行 (0.00 秒)


mysql> yg (yg_name, bm_id) に値 ('xu', 1), ('zhuang', 2), ('lili', 1) を挿入します。
クエリは正常、3 行が影響を受けました (0.09 秒)
記録: 3 重複: 0 警告: 0

mysql> yg から * を選択します。
+----+---------+-------+
| id | yg_name | bm_id |
+----+---------+-------+
| 2 | 徐 | 1 |
| 3 | 荘 | 2 |
| 4 | リリ | 1 |
+----+---------+-------+
セット内の 3 行 (0.00 秒)

-- 外部キーに関連付けられたデータは、関連付けられたテーブルに存在する必要があります。存在しない場合はエラーが報告されます。
mysql> yg (yg_name, bm_id) に値 ('xu'、3) を挿入します。
エラー 1452 (23000): 子行を追加または更新できません: 外部キー制約が失敗しました (`book_manage`.`yg`、制約 `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`))

-- カスケード更新および削除を使用しない場合、次のエラーが発生します。次の SQL ステートメントは、次の記事で紹介されます。 。 。
mysql> update bm set id=5 where id=2; -- bm テーブルの id=2 のレコードを id=5 に変更します
エラー 1451 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました (`book_manage`.`yg`、制約 `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`))

mysql> delete from bm where id = 2; -- bm テーブル内の id 2 のレコードを削除します エラー 1451 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました (`book_manage`.`yg`、制約 `yg_ibfk_1` FOREIGN KEY (`bm_id`) REFERENCES `bm` (`id`)) 

多対多

多対多の関係は、書籍と著者を例にして詳しく説明されています。書籍と著者はなぜ多対多の関係を持つのでしょうか?

まず、本のテーブルの観点から考えてみましょう。本には複数の著者が存在する可能性がありますか?答えはイエスです

著者テーブルの観点から: 著者は複数の本を書くことができますか?答えはイエスです

書籍テーブルと著者テーブルは双方向の 1 対多であるため、2 つのテーブル間の関係は多対多です。

2 つのテーブルを作成しましょう。

-- ブックテーブルを作成する create table book(
    id int 主キー auto_increment,
    タイトルvarchar(32),
    価格 int、
    著者ID int,
    外部キー(author_id)はauthor(id)を参照します。
    更新カスケード
    削除カスケード
);

-- 著者テーブルを作成する create table author(
    id int 主キー auto_increment,
    名前varchar(32)、
    年齢 int、
    書籍ID int,
    外部キー(book_id)はbook(id)を参照します。
    更新カスケード
    削除カスケード
);

上記の方法でテーブルを作成すると、間違いなく成功しません。 1対多のテーブル関係を作成するときは、まず関連テーブル、つまり外部キーのないテーブルを作成する必要があると述べました。 しかし、多対多の関係は双方向の1対多の関係であり、各テーブルに外部キーが存在します。 どうすればよいでしょうか?解決策は、多対多の関係にある 2 つのテーブル間の関連付けを格納するために使用される 3 番目のテーブルを作成することです。

-- ブックテーブルを作成するmysql> create table book(
    id int 主キー auto_increment, 
    名前varchar(10), 
    価格 int
);
クエリは正常、影響を受けた行は 0 行 (0.01 秒)

-- 著者テーブルを作成するmysql> create table author(
    id int 主キー auto_increment, 
    名前varchar(6), 
    年齢 int
);
クエリは正常、影響を受けた行は 0 行 (0.01 秒)


-- 本と著者のテーブル間の関連を保存するための3番目の章テーブルを作成します。mysql> create table book2author(
    id int 主キー auto_increment, 
    著者ID int, 
    書籍ID int, 
    外部キー(author_id)はauthor(id)を参照します。 
    更新カスケード 
    削除カスケードでは、 	
    外部キー(book_id)はbook(id)を参照します。 
    更新カスケード 
    削除カスケード時);
クエリは正常、影響を受けた行は 0 行 (0.02 秒)

一対一

テーブルに多くのフィールドがあり、データを照会するたびにすべてのフィールドを使用できない場合は、テーブルを 2 つに分割できます。たとえば、ユーザー情報テーブルでは、ユーザーの情報にはユーザー名、パスワード、年齢、性別、住所、電話番号などが含まれており、ユーザーのユーザー名とパスワードのみが頻繁に使用される可能性があります。この場合、ユーザー情報テーブルをユーザー基本情報テーブルとユーザー詳細情報テーブルに分割できます。同様に、2 つのテーブルの関係は、転置思考によって決定できます。

まず、ユーザーの基本情報テーブルを確認します。ユーザーは複数の詳細情報を持つことができますか?答えはノーです。

ユーザー詳細テーブルをもう一度見てみましょう。1 つのユーザー詳細が複数のユーザーに属することはできますか?答えはノーです。

一方向の 1 対多の関係が成立しない場合は、2 つの間のテーブル関係は 1 対 1 であるか、関係がない状態になります。

SQL ステートメントを使用して 1 対 1 の外部キー関係を確立する場合、外部キーはどちらの側にも構築できますが、クエリ頻度の高いテーブルに外部キーを構築することをお勧めします。同様に、テーブルを作成する場合は、まず関連するテーブルを作成します。

-- ユーザー詳細テーブルを作成する create table authordetail(
	id int 主キー auto_increment,
	電話int、
	アドレスvarchar(64)
);

--ユーザー基本情報テーブルテーブル作成者(
	id int 主キー auto_increment,
    名前varchar(32)、
    年齢 int、
    著者詳細ID int,
    外部キー(authordetali_id)はauthordetali(id)を参照します。
    更新カスケード
    削除カスケード
);

テーブル関係の概要

テーブルの関係を確立するには、外部キーを使用し、相手の立場で考えてテーブル間の関係を決定する必要があります。

1対多のテーブル関係: 外部キーは多側に構築されます

1 対 1 のテーブル関係: 外部キーはどちらの側にも構築できますが、クエリ頻度が高い側に構築することをお勧めします。

多対多のテーブル関係: 2 つのテーブル間の関係を保存するために 3 番目のテーブルを作成する必要があります。

上記は、MySQL の外部キー制約とテーブル関係の詳細な概要です。MySQL の外部キー制約とテーブル関係の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL と Oracle のデータ型の対応 (表形式)
  • MySQL の結合テーブルにインデックスを作成する方法
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明
  • Pythonはdict辞書型のデータをMysqlに保存し、テーブルと列を自動的に作成します
  • MySQL と PHP の基礎と応用トピック: データベース テーブルの作成
  • MySQL で 800 万エントリのテスト データ テーブルをすばやく作成する方法
  • MySQLは実際には3つの関係テーブルを作成します

<<:  画像内のrarファイルを隠す方法

>>:  Nginx リクエスト制限の設定方法

推薦する

Dockerコンテナでユーザーを切り替えるときに権限が不足する問題を解決する方法

Docker コンテナでユーザーを切り替えると、権限が不十分であるというメッセージが表示されます。解...

HTML シンプルショッピング数量アプレット

この記事では、参考までにシンプルなHTMLショッピング数量アプレットを紹介します。具体的な内容は次の...

Linux での mysql-5.7.28 インストール チュートリアル

1. 公式ウェブサイトから Linux バージョンをダウンロードします: https://dev.m...

Gearman + MySQL による永続化操作例

この記事では、gearman+mysql メソッドを使用して永続化操作を実装します。ご参考までに、詳...

Python ベースの Linux システムにおける特定のプロセスのパフォーマンス監視の考え方の詳細な説明

インターネット上には Linux サーバーを監視するためのツール、コンポーネント、プログラムが多数あ...

MySQL で大量のデータ (数千万) を素早く削除するためのいくつかの実用的なソリューションの詳細な説明

著者は最近、仕事でパフォーマンスのボトルネックの問題に遭遇しました。MySQL テーブルには毎日約 ...

LinuxにKafkaをインストールする

目次1.1 前提条件としてのJava環境1.2 Zookeeperのインストールと設定1.3 Kaf...

Vue バックエンド管理システムのページング機能の実装例

この記事では、主に Vue バックグラウンド管理システムのページング機能の実装を紹介し、次のように共...

Ubuntu 20.04にSogou入力方式をインストールする詳細な手順

1. Fcitx入力フレームワークをインストールする関連する依存ライブラリとフレームワークは自動的に...

nginx のバージョン番号と WEB サーバー情報を隠すための解決策

Nginxはバージョン情報を隠すだけでなく、カスタムWebサーバー情報もサポートします。まずは最終的...

MySQL トランザクション分離はどのように実現されますか?

目次同時シナリオ書き込む読む読む読み取り-書き込みと書き込み-読み取りMySQL のロック行レベルロ...

Vueタイムラインコンポーネントの使い方

この記事の例では、参考までにvueタイムラインコンポーネントの具体的な実装コードを共有しています。具...

Vueは複数列レイアウトドラッグを実装します

この記事では、マルチカラムレイアウトドラッグを実装するためのVueの具体的なコードを参考までに共有し...

Dockerが新しいイメージをロードした後にリポジトリとタグ名が両方ともnoneになる問題を解決する

次のコマンドを使用できます: docker tag [イメージID] [名前]:[バージョン]例えば...

Macにmysql5.7.18をインストールする詳細な手順

1. ツール今必要なツールは2つあります: MySQLサーバー (mysql-5.7.18)、MyS...