MySQL での外部キーの作成、制約、削除

MySQL での外部キーの作成、制約、削除

序文

MySQL バージョン 3.23.44 以降では、InnoDB エンジン タイプのテーブルは外部キー制約をサポートします。

外部キーを使用する条件:

1. 両方のテーブルは InnoDB テーブルである必要があります。MyISAM テーブルは現時点では外部キーをサポートしていません (将来のバージョンではサポートされる可能性があると言われていますが、少なくとも現時点ではサポートされていません)。

2. 外部キー列にはインデックスが必要です。MySQL 4.1.2 以降のバージョンでは、外部キーを作成すると自動的にインデックスが作成されますが、それ以前のバージョンを使用する場合は、明示的にインデックスを作成する必要があります。

3. 外部キー関係にある 2 つのテーブルの列は、同様のデータ型、つまり、int と tinyint のように相互に変換可能な列である必要がありますが、int と char はそうではありません。

外部キーの利点: 2 つのテーブルを関連付け、データの一貫性を確保し、いくつかのカスケード操作を実装できます。

1. 外部キーの作成

構文1: 後続加算方式

alter table テーブル名 制約を追加 制約名 外部キー (現在のテーブルで制約されているフィールド) はメイン テーブル名 (制約されるフィールド名) を参照します。
テーブル student を変更し、制約 fk_class_student を追加し、更新時に外部キー (cls_id)、クラス (cls_id) を追加し、削除時にカスケードを実行し、アクションは実行しません。

構文2: テーブルの作成方法

学生テーブルを作成(
sid int 主キー、
cls_id int が null ではない、
sname varchar(10) が null ではない、
制約 fk_class_student 外部キー (cls_id) は更新時にクラス (cls_id) を参照し、削除時にカスケードを実行します。アクションはありません。
)ENGINE=InnoDB デフォルト文字セット=utf8;

追加ポイント:

SHOW CREATE TABLEクラス

テーブル作成情報を照会できます

ここに画像の説明を挿入

テーブル `class` を作成します (
 `cls_id` int NULLではない、
 `cls_name` varchar(15) NOT NULL,
 主キー (`cls_id`)
) エンジン=InnoDB デフォルト文字セット=utf8

次のデモンストレーションでは、先ほど作成した学生テーブルとクラステーブルを使用します。

内容は以下のとおりです

ここに画像の説明を挿入

ここに画像の説明を挿入

2. 4つの制約方法について

親テーブルで更新/削除操作を実行する場合、子テーブルの操作タイプ

  1. CASCADE サブテーブルは、削除されたキー値への参照を含むすべてのデータを削除します。
  2. SET NULL 親テーブルが削除または更新されると、子テーブルは関連するレコードの外部キーフィールドが配置されている列を NULL に設定します。
  3. RESTRICT 関係のあるフィールドの削除要求を拒否します (これがデフォルトであり、最も安全な設定です)
  4. NO ACTIONはRESTRICTに似ています

先ほど設定した外部キ​​ーを例に挙げます(更新時にカスケード、削除時にアクションなし)

削除しようとすると

cls_id=1 のクラスから削除

結果は以下のとおりです

ここに画像の説明を挿入

外部キー制約に on delete no action が存在するため、メイン テーブルでの削除操作は許可されないことがわかります。しかし、サブテーブルは

cls_id=1 の学生から削除

ここに画像の説明を挿入

親テーブルの関連キーを更新すると、on updateカスケードの存在により正常に更新されます。

cls_id=1 のクラスセット cls_id=4 を更新します

ここに画像の説明を挿入

メインテーブルが更新されると、子テーブルの外部キーフィールドも更新されます。

ここに画像の説明を挿入

3. 外部キーを削除する方法

テーブルサブテーブル名を変更し、外部キーを削除し、外部キー制約名を学生テーブルに変更し、外部キー f​​k_class_student を削除します。

外部キーを削除すると、親テーブルの動作は正常になります。

ここに画像の説明を挿入

要約する

これで、MySQL の外部キーの作成、制約、削除に関するこの記事は終了です。MySQL の外部キーの作成、制約、削除の詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の null 制約のケースの説明
  • MySQL 外部キー制約 (FOREIGN KEY) ケースの説明
  • MySQL 外部キー制約とテーブル関係の概要
  • MySQL 整合性制約の定義と例のチュートリアル
  • MySQL 8.0 の新機能 - チェック制約の紹介
  • MySQL のインデックスと制約の例文
  • MySQL 外部キー制約の例の説明
  • MySQL 外部キー制約の詳細な説明
  • MySQL 整合性制約の例の詳細な説明
  • MySQL 制約の超詳細な説明

<<:  HTML テーブル マークアップ チュートリアル (43): テーブル ヘッダーの VALIGN 属性

>>:  Linux で Apache を使用してファイル サーバーを構築する手順

推薦する

オーディオマニアにアピールするオーディオビジュアルLinuxディストリビューション

私は最近、多くの音楽に特化した Linux ディストリビューションの 1 つである Audiovis...

Centos7 に Nginx 統合 Lua サンプル コードをインストール

序文私が使用しているパソコンはMacで、OSはmacOS Mojaveです。コンピュータに仮想マシン...

インデックスは MySQL クエリ条件で使用されますか?

雇用主から MySQL クエリ条件でインデックスが使用されるかどうかを尋ねられた場合、どのように答え...

axios リクエストのカプセル化に基づく Vue アプリケーションのサンプルコード

目次axiosとは何ですか? Axios リクエストタイプ? Axiosはデフォルトのカスタム構成を...

JS 矢印関数に適さないシナリオは何ですか?

目次概要オブジェクトにメソッドを定義するオブジェクトリテラルオブジェクトプロトタイプ動的コンテキスト...

Vue画像拡大鏡コンポーネントのカプセル化と使用方法の詳細な説明

Vue画像拡大鏡コンポーネントパッケージに基づいて、参考までに具体的な内容は次のとおりです。画像拡大...

JavaScript配列の一般的なメソッドの例のまとめ

目次一般的な配列メソッドconcat() メソッドjoin() メソッドpop() メソッドpush...

WindowsにMySQL5.7圧縮パッケージを素早くインストールする

この記事では、Windows に MySQL 5.7 圧縮パッケージをインストールする方法について説...

レスポンシブデザインについての簡単な説明

1. レスポンシブ デザインとは何ですか?レスポンシブデザインとは、ウェブサイトの開発プロセス中に、...

Mysql は、デッドロック問題を解決するために kill コマンドを使用します (実行中の特定の SQL ステートメントを強制終了します)。

MySQL を使用して特定のステートメントを実行すると、データ量が多いためにデッドロックが発生し、...

VUE でタブページを切り替える 4 つの方法

目次1. 静的実装方法: 2. 第2のシミュレーション動的方法3. 3番目の動的データ方式4. 動的...

React Fragment の紹介と詳しい使い方

目次序文フラグメントの動機React Fragment の紹介と使用<React.Fragme...

VMware15 の Deepin インストール詳細チュートリアル (画像とテキスト)

序文Deepin のユーザー インターフェイスは、使用時に非常に見栄えがします。インターフェイス効果...

Bootstrapグリッドの垂直および水平配置の詳細な説明

目次1. Bootstrap グリッドレイアウト2. 垂直方向の配置2.1 行タグの垂直方向の配置を...

VMwareでCentOSがインターネットにアクセスできない問題を素早く解決

昨日、VMware に CentOS7 をインストールしました。Tomcat パッケージを転送するた...