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 サーバーを構築するための詳細なチュートリアル

推薦する

MySQL の無効な左結合の問題を解決する方法とその使用上の注意

MySQLの左結合が無効であり、その使用方法今日SQLを書いていたとき、左結合を使用すると左のテーブ...

エレガントなJSコードの書き方

目次変数意味があり発音しやすい変数名を使用する同じ型の変数には同じ語彙を使用する検索可能な名前を使用...

WeChatアプレットがユーザーの移動軌跡を記録

目次設定を追加json 構成レイヤー構成の表示論理層の構成位置追跡をオンにする録音を開始開始座標を決...

MySQLにおける遅いSQLの最適化の方向性について詳しく話しましょう

目次序文SQL文の最適化遅いクエリSQLを記録する設定を変更する方法スロークエリログを表示するSQL...

WeChatミニプログラムの開発をスピードアップするためのヒント

1. app.jsonを使用してページを作成する私たちの通常の開発習慣によれば、新しいページを作成す...

Linux でリモート MySQL データベースを手動で展開する方法の詳細な説明

1. mysql をインストールします。次のコマンドを実行して、YUM ソースを更新します。 rpm...

line-height=height要素の高さだがテキストが垂直方向に中央揃えされない問題を解決する

まず、行の高さが要素の高さと等しい場合にテキストが垂直方向に中央揃えにならない理由を説明します。実際...

Vue+Echart 棒グラフで疫病データ統計を実現

目次1. まずプロジェクトにechartsをインストールします2. echartsに縦棒グラフテンプ...

MySQLウィンドウ関数の具体的な使用法

目次1. ウィンドウ関数とは何ですか? 1. ウィンドウをどのように理解しますか? 2. ウィンドウ...

MySQL がテーブルを読み取れないエラー (MySQL 1018 エラー) の解決方法

1. エラーの再現MySQL データベースにはアクセスできますが、データベース テーブルを読み取るこ...

dockerでpdflatex環境を設定する方法

技術的背景Latex は文書作成、特に記事作成には欠かせないツールであり、必須のテキスト組版ツールで...

Linux サーバーの状態を監視する方法

私たち、特に Linux エンジニアは毎日 Linux サーバーを扱っています。サーバーのセキュリテ...

MySQL データ型 DECIMAL の使用方法の詳細な説明

MySQL DECIMALデータ型は、データベースに正確な数値を保存するために使用されます。会計シス...

ネイティブ JavaScript を使用した Web 計算機の実装

この記事では、参考までに、計算機のWebバージョンを実装するためのJavaScriptの具体的なコー...

MySQL 自動インクリメント ID 枯渇の例

ディスプレイ定義IDテーブルに定義された自動増分IDが上限に達した場合、次のIDを申請する際に得られ...