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 リクエスト制限の設定方法

推薦する

axios リクエストのカプセル化に基づく Vue アプリケーションのサンプルコード

目次axiosとは何ですか? Axios リクエストタイプ? Axiosはデフォルトのカスタム構成を...

ウェブサイトのハイパーリンクを開く方法に関する議論

新しいウィンドウが開きます。 利点: ユーザーがリンクをクリックしても、現在閲覧しているコンテンツは...

mysql5.5.28 のインストール チュートリアルは非常に詳細です。

参考までにmysql5.5.28のインストールチュートリアルです。具体的な内容は次のとおりです。イン...

Avue でカスタム検索バーを実装し、検索イベントをクリアする実践

目次1. 検索バーの内容をカスタマイズする2. 検索ボタンをカスタマイズする検索バーをカスタマイズし...

Docker - コンテナマウントディレクトリを変更する3つの方法のまとめ

方法 1: 設定ファイルを変更する (docker サービスを停止する必要があります) 1. doc...

Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明

Java で ffmpeg を呼び出してビデオ形式を flv に変換する方法の詳細な説明注:以下のプ...

Nodejs 探索: シングルスレッドの高並行性の原理を深く理解する

目次序文一目でわかる建築オペレーティングシステムとの対話シングルスレッドイベント駆動/イベントループ...

画像をラベルとして使用すると、IE では for 属性が機能しません。

例えば:コードをコピーコードは次のとおりです。 <input type="check...

Spring Boot 階層化パッケージング Docker イメージの実践と分析 (推奨)

目次1. Springbootプロジェクトを準備する2. 関連する設定を実行する3.パッケージ4.D...

シンプルなウェブ計算機を実装するJavaScript

背景私は新しいプロジェクト チームに配属されたので、プロジェクトでは js を使用する必要があります...

Docker MQTT のインストールと使用のチュートリアル

MQTT の紹介MQTT (Message Queuing Telemetry Transport)...

XHTML タグのネスト規則の分析

XHTML 言語では、ul タグに li が含まれ、dl タグに dt と dd が含まれることは誰...

CSS を使用して複数の方法で等幅レイアウトを実装するサンプルコード

この記事で説明する等幅レイアウトでは、純粋な CSS を使用して、要素の幅を手動で設定することなく、...

npm グローバル モジュールのデフォルトのインストール パスを変更するためにノードのインストールをカスタマイズする手順

node を D ドライブにインストールしましたが、C ドライブのスペースを占有したくなかったため、...