MySQL外部キーの基本的な機能と使用方法の詳細な説明

MySQL外部キーの基本的な機能と使用方法の詳細な説明

この記事では、例を使用して、MySQL 外部キーの基本的な機能と使用方法を説明します。ご参考までに、詳細は以下の通りです。

この記事の内容:

  • 外部キーとは何か
  • 外部キーの追加
  • 外部キーの変更と削除
  • 外部キー制約モード

リリース日: 2018-04-12


外部キーとは何ですか?

  • 外部キーは、別のテーブルの主キーを指すテーブル内のフィールドです。このフィールドは外部キーと呼ばれることがあります。
  • テーブルには複数の外部キーを設定できます。
  • 外部キーは、テーブル間の関係を制約するために使用されます。外部キーはテーブル間の関係をマッピングしていると言えます。この関係は、テーブル間の関係の近さと存在を扱うのに役立ちます(たとえば、学生テーブルの cid クラス番号は、クラステーブルの id に関連付けられています。cid は存在しないはずがありません。外部キー cid が追加されず、関係が確立されていない場合、クラス番号が存在しないことがわかりません)。
  • 言い換えれば、外部キーはデータベース システムに、私たちが関係として考えていることを伝えます。システムは純粋なデータの実際の意味を認識しておらず、外部キーはシステムに関係の処理方法を指示します。
  • したがって、外部キーの中核は制約です。

外部キーの追加:

  • 外部キーを作成するための前提条件は、フィールドがまずインデックスであることです。そうでない場合、外部キーは通常のインデックスとして作成されます(したがって、心配する必要はありません)。
  • 外部キーを作成するためのもう 1 つの前提条件は、「ポインティング テーブル」が作成されていることです。存在しないテーブルの場合、外部キーを使用してそのテーブルに対応させることはできません。
  • 増やす方法:
    • 1. テーブルを作成するときに定義し、すべてのフィールドが定義された後に外部キー参照を使用してテーブル(主キー)を指します。例: image
    • 2. 追加するフィールドを変更することもできます: alter table table name add [constraint foreign key name] foreign key (foreign key field) references parent table (primary key field);
      • 制約外部キー名: 外部キーの名前を定義するのに役立ちますが、外部キー名は一意である必要があり、システム定義の名前が重複することはないため、推奨されません。
テーブル学生を作成(
id int 主キー auto_increment,
名前varchar(15)がnullでない、
性別 varchar(10) nullではない、
cid int、
外部キー(cid)はクラス(id)を参照します
);
テーブルクラスを作成する(
id int 主キー auto_increment,
cname varchar(15)
);

補充:

  • MySQL では、ストレージ エンジンが innodb でない場合、外部キーを正常に追加できたとしても、外部キー制約は有効になりません。
  • 外部キー名は繰り返すことができないため、制約外部キー名の使用はお勧めしません。

外部キーの変更と削除:

  • 変更: 外部キーが指すものなどの外部キー情報を変更することはできません。最初に削除してから追加することしかできません。
  • 削除構文: alter table table name drop foreign key foreign key name;
    • ここでの外部キー名は、外部キー フィールドではなく、外部キー名です。定義に制約が使用されていない場合は、show create を使用して、テーブル作成ステートメントでシステム定義の外部キー名を表示できます。
    • image

補充:

  • 外部キーを削除するときに desc を使用すると、テーブル構造にインデックスである MUL も含まれていることがわかります。外部キーが作成されると、フィールドはインデックスとして作成されるためです。保持したくない場合は、テーブル名のドロップ インデックス フィールド名を使用できます。

外部キー制約モード:

  • 外部キーはテーブル間の関係を制限するために使用されます。
  • (外部キーを作成するテーブルは子テーブルと呼ばれ、それが指すテーブルは親テーブルと呼ばれます)
    • 子テーブルの場合: 子テーブルの挿入と変更を制約できます [この制約は、子テーブルに対する親テーブルの制約です]
      • 外部キーを挿入および変更するときに、外部キー フィールドに対応する一致が見つからない場合、挿入/変更は失敗します (たとえば、コース選択レコードを挿入するときに、コース テーブルに存在しないコースを挿入することはできません)。
      • 例えば: image
    • 親テーブルの場合:親テーブルの削除と更新を制約することができます。通常、次の制約モードがあります。 [この制約は、親テーブルに対する子テーブルの制約です]
      • モデル:
        • 厳密モード: 外部キーの削除と更新に関して、対応するレコードの主キー データが子テーブルですでに使用されている場合は、削除できません (たとえば、誰かがすでにクラスに登録している場合、学校はそのクラスを削除することはできず、誰も登録していないクラスのみを削除できます)。
        • カスケード モード: 外部キーの削除と更新の場合、フィールドが子テーブルで使用されていると、子テーブルのデータがそれに応じて更新されます (たとえば、クラス番号が変更されると、学生テーブルのクラスもそれに応じて変更されます。クラスが削除されると、対応するクラスのすべての学生が削除されます)。
        • NULL モードの設定: 外部キーの削除と更新の場合、フィールドが子テーブルで使用されていると、子テーブルの外部キー データは NULL に設定されます (たとえば、クラスが削除された場合、すべての生徒を削除するのではなく、最初に NULL に設定してからクラスに再割り当てする必要があります) [子テーブルを NULL に設定する前提は、フィールドが NULL になることを許可できることです]
      • 実際、異なる操作ごとに異なるモードを指定できます
      • まとめると(私の例に基づいて)、実際、適切な対策は、削除するときに空のままにしておくこと(クラスがあまりにも悪くて削除したい場合でも、すべての生徒をそのクラスから削除するのではなく、他のクラスに割り当てる必要があります)、変更するときにカスケードすること(クラス番号を変更できるようにし、変更が生徒に更新されます)です。
      • 異なる操作に異なるモードを設定する方法(子テーブルでの操作):外部キー(外部キーフィールド)は操作モードで親テーブル(主キー)を参照します
        外部キー (外部キー フィールド) は親テーブル (主キー) を参照し、削除時に更新カスケードで null を設定します。 
-- 実験的なテーブル構造テーブルクラスの作成(
id int 主キー auto_increment,
cname varchar(15)
);
テーブルstudent2を作成(
id int 主キー auto_increment,
名前varchar(15)がnullでない、
性別 varchar(10) nullではない、
cid int、
外部キー(cid)はクラス(id)を参照し、削除時にnullを設定し、更新カスケード時にnullを設定します。
);
-- 実験テーブルデータ:
クラス(cname)に値("python"),("linux"),("java"),("html5")を挿入します。

student2(name,gender,cid) に values("Alice","female",1) を挿入します。
student2(名前、性別、cid) に値 ("John","女性",2) を挿入します。
student2(name,gender,cid) に values("Jack","female",3) を挿入します。
student2(名前、性別、CID) に値 ("エイミー","女性",4) を挿入します。

学生2から*を選択します。
クラスから*を選択します。
-- カスケード更新クラス set id = 6 where cname="python" を更新しようとします。
select * from student2; -- オリジナルの python cid=6
-- 削除して null に設定してみます delete from class where cname="java";
select * from student2; -- 結果は、元のJava cid=null

補充:

  • 制約モードを適切に設定する必要があります。複数のサブテーブルで異なる制約モードを使用しないでください。そうしないと、競合が発生します。

MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL クエリ スキル」、「MySQL 共通関数の概要」、「MySQL ログ操作スキル」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキル」、および「MySQL データベース ロック関連スキルの概要」

この記事が皆様のMySQLデータベース設計に役立つことを願っています。

以下もご興味があるかもしれません:
  • MySQL外部キーの3つの関係例の詳細な説明
  • MySQL データベースのデータ テーブルの最適化、外部キーの分析、3 つのパラダイムの使用
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明
  • MySQL 外部キー制約の一般的な操作の例 [表示、追加、変更、削除]
  • MySQL が外部キーを作成できない理由と解決策
  • 外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介
  • MySQL テーブルを削除するときに外部キー制約を無視するシンプルな実装
  • MySQL が外部キーエラーを追加します: 1215 外部キー制約ソリューションを追加できません
  • MySQL で外部キーを使用してカスケード削除と更新を実装する方法
  • MySQL テーブル作成外部キー エラーの解決方法

<<:  Pagoda Panel のインストール時にサーバーがデータベースにリモート接続できない問題の解決策

>>:  jsは画像切り取り機能を実現する

推薦する

MySQL 8.0.12 の詳細なインストールおよびアンインストール チュートリアル

1. MySQL 8.0.12 バージョンのインストール手順。 1. ダウンロードhttps://d...

Vueでフォーム検証を実装する方法

1. インストールと使用まず、Vue プロジェクトにインストールします。 npm インストール --...

HTML メタタグの小さなコレクション

<Head>……</head> は <HTML> のファイル ヘ...

JavaScript ECharts の使用方法の説明

以前、プロジェクトを行う際に ECharts を使用しました。今日はそれをメモとして整理し、より多く...

JavaでTomcatサーバーを起動/停止する方法

1. プロジェクト構造 2.Tomcat.javaを呼び出す パッケージ com.calltomca...

React Hooksコンポーネント間で値を渡す方法の詳細な説明(tsを使用)

目次父から息子へ息子から父へクロスレベルコンポーネント(親から子孫)父から息子へpropsを通じて値...

CSSアニメーションによるテーブルスクロールカルーセル効果の実装

前回の CSS 回転灯と同じ内容の CSS アニメーションの応用です。これは単なる別のアプリケーショ...

docker+jenkins+node.js の自動デプロイメント環境をゼロから構築する方法

このケースはCentOS 7システムに基づいていますDockerの使用経験がある人に適していますLi...

HTML iframe と frameset の違い_PowerNode Java Academy

導入1.<iframe> タグ: iframe は、ページ内に内部フレームを生成するイン...

Reactの状態管理の3つのルールのまとめ

目次序文No.1 焦点No.2 複雑な状態ロジックの抽出No.3 複数状態操作の抽出要約する序文Re...

カレンダー効果を実現するための Bootstrap+JQuery

この記事では、カレンダー効果を実現するためのBootstrap+Jqueryの具体的なコードを参考ま...

Vue3 の emitting と attr の違いの分析

目次結論は実践分析拡張機能要約する結論は親コンポーネントでカスタム イベントが定義されている場合、子...

MySQLクエリインターセプトの詳細な分析

目次1. クエリの最適化1. MySQLチューニングの概要2. 小さなテーブルが大きなテーブルを動か...

HTML 5のドラフトは正式な標準にはならなかった

<br />昨日、W3C で新しいHTML 5 ドラフト (ワーキング ドラフト) が ...

Linux ディスクのシーケンシャル書き込みとランダム書き込みの方法

1. はじめに● ランダム書き込みではヘッドがトラックを頻繁に変更するため、効率が大幅に低下します。...