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

推薦する

マークアップ言語 - CSS レイアウト

123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...

MySQL挿入パフォーマンスを最適化する方法の例

MySQL パフォーマンスの最適化MySQL パフォーマンスの最適化とは、リソースを合理的に配置し、...

CocosCreatorがスキル冷却効果を実装

CocosCreatorがスキルCD効果を実現多くのゲームにはスキルがあります。プレイヤーがスキルボ...

Vue で Google サードパーティ ログインを実装するためのサンプル コード

目次1. 開発者プラットフォームの構成問題を解決する1. 開発者プラットフォームの構成1. 開発者プ...

nginxはdockerコンテナ内に設定ファイルを自動的に生成します

企業が Docker 自動デプロイメントを構築する場合、Docker の実行時にコンテナ内の設定ファ...

IDEA で Linux コマンドを使用する方法

Windows システムと比較して、Linux システムは多数の豊富なコマンドライン ツールを提供し...

HTMLの行間設定方法と問題点

<p></p> の行間隔を設定するには、style="line-h...

Linux コマンドライン操作 Baidu クラウドのファイルのアップロードとダウンロード

目次0. 背景1. インストール2. Baidu Cloudアカウントにログインする3. ファイルを...

MySQLトランザクションとMySQLログの詳細な説明

取引特性1. アトミック性: トランザクションの開始後、すべての操作が完了するか、まったく実行されな...

UbuntuへのDocker CEのインストール

この記事は、Ubuntu 17.10 での Docker CE のインストールを記録するために使用さ...

ウェブサイトをより高く、よりデザイン的に見せる方法

「ウェブサイトを高級感のあるものにするにはどうすればいいでしょうか? それともデザイン重視にすればい...

Centos7 で yum を使用して Ceph 分散ストレージをインストールするチュートリアル

目次序文yumソース、epelソースを設定するCephソースの設定Cephとそのコンポーネントをイン...

MySQL/MariaDB ルートパスワードリセットチュートリアル

序文パスワードを忘れることは、よく遭遇する問題です。MySQL または MariaDB データベース...

JavaScript を使用せずに HTML の a タグを無効にするには、純粋な CSS を使用します。

実際、この問題は、HTML の select タグを初めて学んだときにすでに発生していました。今日に...

MySQLのレプリケーションの詳細な分析

1.MySQLレプリケーションの概念これは、プライマリ データベースの DDL および DML 操作...