MySQL 外部キー制約の詳細な説明

MySQL 外部キー制約の詳細な説明

公式ドキュメント:
https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

1. 外部キー関数:

MySQL は外部キー制約を使用して、テーブル間のデータの整合性と正確性を確保します。

2. 外部キーの使用条件

  • どちらのテーブルも InnoDB テーブルである必要があります。MyISAM テーブルは今のところ外部キーをサポートしていません (将来のバージョンではサポートされる可能性があると言われていますが、少なくとも現時点ではサポートされていません)
  • 外部キー列にはインデックスを作成する必要があります。MySQL 4.1.2 以降のバージョンでは、外部キーを作成すると自動的にインデックスが作成されますが、それより前のバージョンを使用する場合は、明示的にインデックスを作成する必要があります。
  • 外部キー関係にある 2 つのテーブルの列は、同様のデータ型、つまり、int と tinyint のように相互に変換可能な列である必要がありますが、int と char はそうではありません。

3. 文法を作成する

[制約 [シンボル]] 外部キー
[インデックス名] (列名、...)
参照 tbl_name (col_name,...)
[ON DELETE 参照オプション]
[更新時の参照オプション]

参照オプション:
制限 | カスケード | NULL に設定 | アクションなし | デフォルトに設定

この構文は、CREATE TABLE および ALTER TABLE で使用できます。CONSTRAINT シンボルを指定しない場合は、MYSQL によって自動的に名前が生成されます。
ON DELETE と ON UPDATE はイベントトリガーの制限を示し、パラメータを設定できます。
RESTRICT (外部テーブルの外部キーへの変更を制限する)
CASCADE (外部キーの変更に従う)
NULL に設定
SET DEFAULT (デフォルト値を設定する)
NO ACTION (アクションなし、デフォルト)

CASCADE: 親テーブルが更新または削除されると、子テーブル内の対応するレコードも更新または削除されることを示します。
RESTRICT および NO ACTION: 子テーブルに関連レコードがある場合、親テーブルを個別に削除または更新することはできません。
SET NULL: 親テーブルが更新または削除されると、子テーブルの対応するフィールドがNULLに設定されることを示します。

4. ケースデモンストレーション

CASCADE制約モード

1. パワーテーブル(親テーブル)の国を作成する
国テーブルを作成 (
id int が null ではない、
名前varchar(30),
主キー(ID)
);

2. レコードを挿入します insert into country values(1,'Western Europe');
国の値に挿入します(2,'Maya');
国の値に挿入します(3,'シチリア');

3. 武器テーブル(サブテーブル)を作成し、制約を設定します。create table solider(
id int が null ではない、
名前varchar(30),
国ID int,
主キー(ID)、
外部キー(country_id)は、削除カスケードおよび更新カスケードでcountry(id)を参照します。
);

4. 参照整合性テストを solider values(1,'Western European trainee infantry',1) に挿入します。
#insert は solider values(2,'Maya short spearman',2) に正常に挿入されました。
#insert は soldier values(3,'Sicily Norman Knights',3) に正常に挿入されました
#挿入に成功しましたinsert into solider values(4,'French Swordsman',4);
# 国テーブルに ID 4 の派閥がないため、挿入に失敗しました。5. 制約メソッド test insert into solider values(4, 'Maya Tiger Warriors', 2);
#country where id=2 の delete が正常に挿入されました。
#これにより、兵士テーブル内の ID 2 と 4 のレコードが同時に削除されます。この派閥は親テーブルに存在しなくなったため、対応する武器は自然に消えます。update country set id=8 where id=1;
#その結果、country_idが1であるsoliderテーブルのすべてのレコードも8に変更されます。

SET NULL制約あり

1. 兵士テーブル (サブテーブル) を作成し、制約関係を確立して、兵士が存在する場合はテーブルを削除します。
テーブル solider を作成します(
id int が null ではない、
名前varchar(30),
国ID int,
主キー(ID)、
外部キー(country_id)はcountry(id)を参照し、削除時にnullが設定され、更新時にnullが設定されます。
);

2. 参照整合性テストを solider values(1,'Western European trainee infantry',1) に挿入します。
#insert は solider に正常に挿入されました values(2,'Maya short spearman',2);
#insert は soldier values(3,'Sicily Norman Knights',3) に正常に挿入されました
#挿入に成功しましたinsert into solider values(4,'French Swordsman',4);
#国テーブルに ID 4 の派閥がないため、挿入に失敗しました。3. 制約メソッド test insert into solider values ​​(4, 'Sicilian Archer', 3);
#country where id=3 の delete が正常に挿入されました。
#これにより、solider テーブルの ID 3 と 4 のレコードが NULL に設定されます。
国を更新します。id=1 の場合、id=8 を設定します。
# ソリダーテーブル内のcountry_idが1であるすべてのレコードをNULLに設定します

NO ACTIONまたはRESTRICTモード(デフォルト)

1. 兵士テーブル (サブテーブル) を作成し、制約関係を確立して、兵士が存在する場合はテーブルを削除します。
テーブル solider を作成します(
id int が null ではない、
名前varchar(30),
国ID int,
主キー(ID)、
外部キー(country_id)はcountry(id)を参照します。削除時はRESTRICT、更新時はRESTRICTです。
);

2. 参照整合性テストを solider values(1,'Western European trainee infantry',1) に挿入します。
#insert は solider に正常に挿入されました values(2,'Maya short spearman',2);
#insert は soldier values(3,'Sicily Norman Knights',3) に正常に挿入されました
#挿入に成功しましたinsert into solider values(4,'French Swordsman',4);
#国テーブル 3 に ID 4 の派閥がないため、挿入に失敗しました。制約メソッド テスト insert into solider values(4, 'Western European Knights', 1);
#country where id=1 の delete が正常に挿入されました。
# エラーが発生しました。子テーブルに関連レコードがあるため、親テーブル内の対応するレコードを削除できません。つまり、arms テーブルには西ヨーロッパに属する武器も含まれているため、親テーブル内の西ヨーロッパ軍だけを削除することはできません。update country set id=8 where id=1;
#エラー、子テーブルに関連レコードがあるため、親テーブルを変更できません

以上がMySQLの外部キー制約の詳細な説明です。MySQLの外部キー制約の詳細については、123WORDPRESS.COMの他の関連記事をご覧ください。

以下もご興味があるかもしれません:
  • MySQL に外部キー制約を追加する具体的な方法
  • MySQL 外部キー制約 (FOREIGN KEY) ケースの説明
  • MySQL 外部キー制約とテーブル関係の概要
  • MySQL 外部キー制約の例の説明
  • 外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介
  • MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装
  • MySQL 子テーブルで外部キー制約チェックを無効にする方法
  • MySQL で外部キー制約を作成および削除する方法

<<:  vue.js 動的コンポーネントの詳細な説明

>>:  Linux 上でプライベート Git サーバーを構築するための詳細なチュートリアル

推薦する

Linux ファイルシステムの説明: ext4 以降

今日は、ext3 や他の以前のファイル システムとの違いを含め、ext4 の歴史について説明します。...

Xiaomi公式サイトの登録・ログイン機能を模倣するJavaScript

目次まずページレイアウトを構築する必要がありますJS関数1 JS関数2 JS関数3 JS関数4効果図...

XHTML 入門チュートリアル: テキストの書式設定と特殊文字

<br />このセクションでは、XHTML でテキストの書式設定と特殊文字を実装する方法...

Docker コンテナの正常なシャットダウン前にトラップを使用して環境のクリーンアップを実行する

実行中のコンテナが終了したときに、コンテナが完全に終了する前に環境をクリーンアップするなど、いくつか...

CSS3 @mediaの基本的な使い方のまとめ

//文法: @media mediatype and | not | only (メディア機能) ...

mysql5.6 の無効な utf8 設定の問題を解決する

mysql5.6 のグリーン バージョンを解凍すると、my-default.ini ファイルが作成さ...

MySQL トランザクション分離レベルとロックメカニズムの問題に関する深い理解

概要データベースは通常、複数のトランザクションを同時に実行します。複数のトランザクションが、同じデー...

Nginx リバース プロキシを使用して go-fastdfs を実行する例

背景go-fastdfs は、http プロトコルをサポートする分散ファイルシステムです。一般的なプ...

Linux の netstat コマンドの詳細な紹介

目次1. はじめに2. 出力情報の説明3. netstatの共通パラメータ4. netstatネット...

時間のかかるMySQLレコードのSQL例の詳細な説明

mysqlは時間のかかるSQLを記録しますMySQL は、最適化と分析のために、時間のかかる SQL...

ホストサービスにアクセスするDockerでのサービスの実装

目次1. シナリオ2. 解決策3. 結論4. 参考文献1. シナリオ日常の開発およびテスト作業には ...

VMware WorkStation を Docker for Windows で使用するための詳細なチュートリアル

目次1. はじめに2. Windows用Dockerをインストールする1. Windows用Dock...

MySQLの行ロックとテーブルロックの意味と違いの詳細な説明

1. はじめに行ロックとテーブルロックの違いは面接で頻繁に出てくるはずです。MySQL のロックにつ...

CSS 評価効果の星の例

何?何のスターコートですか?さて、もっとわかりやすくするために写真を見てみましょう。 よく見ると、パ...

Linuxの運用・保守の基礎知識から上級者向け知識までをまとめました

運用保守エンジニアは、初期段階では非常に大変な仕事です。この期間中、コンピューターの修理、ネットワー...