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は画像切り取り機能を実現する

推薦する

ElasticSearch と ElasticSearch-Head の Docker デプロイメントの実装

この記事では主にDockerを使ってElasticSearch:バージョン6.8.4をデプロイする方...

HTML テーブル マークアップ チュートリアル (15): テーブル タイトル

<br />このタグを使用すると、表のタイトルを直接追加し、タイトル テキストの配置プロ...

MySQLの3値ロジックとNULLの詳細な説明

目次NULLとは何か2種類のNULLなぜ「= NULL」ではなく「IS NULL」と書く必要があるの...

純粋な CSS でマークダウンの自動番号付けを実装するサンプル コード

問題の起源私がタイトルの番号付けの問題に初めて注目したのは、学部の論文を書いていた頃まで遡ります。当...

Dockerイメージのインポートとエクスポートの実装

GitLabのDocker使用法gitlab ドッカー起動コマンド docker run -d -p...

Linux プラットフォームでの Zabbix エージェントのインストールと設定方法

ここでは、Linux プラットフォームでの Zabbix エージェントのインストールと構成について簡...

JavaScript データ構造 双方向リンクリスト

単方向リンク リストは、先頭から末尾、または末尾から先頭への方向のみを走査できます。そのため、単方向...

MySQLの左結合を内部結合に素早く変換するプロセス

日々の最適化プロセス中に、奇妙なことに気付きました。同じ SQL にまったく異なる 2 つの実行プラ...

MySQL 10進数符号なし更新負数を0に変換

今日、インターフェースの同時実行の問題を検証したところ、これまでredisで解決していた同時実行のプ...

LinuxでRPMを使用してmysql5.7.17をインストールする

LinuxでのMySQL5.7 rpmのインストール方法を参考までに記録します。具体的な内容は以下の...

Reactスロットの使い方

目次必要コアアイデアReactでスロットを実装する2つの方法必要コンポーネントを自分で書きました。コ...

VMware15.5 インストール Ubuntu20.04 グラフィック チュートリアル

1. インストール前の準備1. 公式ウェブサイトからUbuntu 20.04のイメージファイルを直接...

Linux は n 日前のログとサンプルコマンドを自動的に削除します

1. ファイル削除コマンド:対応するディレクトリを検索します -mtime + 日数 -name &...

MySQL デッドロック ルーチン: 一意のインデックスの下でのバッチ挿入順序の不一致

序文デッドロックの本質はリソースの競合です。バッチ挿入の順序が一貫していないと、デッドロックに陥りや...