MySQLの主キーと外部キーの使用と説明を簡単に説明します

MySQLの主キーと外部キーの使用と説明を簡単に説明します

1. 外部キー制約

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

外部キーとは何ですか?

主キー: レコードを一意に識別し、重複したり空にしたりすることはできず、データの整合性を確保するために使用されます。

外部キー: 別のテーブルの主キーです。外部キーは重複することも、空にすることもできます。外部キーは他のテーブルとの接続を確立するために使用されます。したがって、外部キーについて話す場合、少なくとも 2 つのテーブルが関係している必要があります。たとえば、次の 2 つの表:

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

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

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

外部キーの定義構文は次のとおりです。

[制約シンボル] FOREIGN KEY [id] (index_col_name, ...)
参照 tbl_name (index_col_name, ...)
[削除時に {制限 | カスケード | NULL に設定 | アクションなし | デフォルトに設定}]
[更新時に {制限 | カスケード | NULL に設定 | アクションなし | デフォルトに設定}]

この構文は、CREATE TABLE および ALTER TABLE で使用できます。CONSTRAINT シンボルを指定しない場合は、MYSQL によって自動的に名前が生成されます。
ON DELETE と ON UPDATE はイベントトリガーの制限を示し、パラメータを設定できます。

  • RESTRICT (外部テーブルの外部キーへの変更を制限する)
  • CASCADE (外部キーの変更に従う)
  • NULL に設定
  • SET DEFAULT (デフォルト値を設定する)
  • NO ACTION (アクションなし、デフォルト)

簡単なデモ使用

dage と xiaodi という 2 つのテーブルを作成します。兄のテーブルが主キーで、弟のテーブルが外部キーです。

テーブルを作成します。

テーブル `dage` を作成します (
 `id` int(11) NOT NULL auto_increment,
 `name` varchar(32) デフォルト ''
 主キー (`id`))
 エンジン=InnoDB デフォルト文字セット=latin1;

テーブル `xiaodi` を作成します (
 `id` int(11) NOT NULL auto_increment,
 `dage_id` int(11) デフォルトはNULL、
 `name` varchar(32) デフォルト ''
 主キー (`id`)、
 キー `dage_id` (`dage_id`),
 制約 `xiaodi_ibfk_1` 外部キー (`dage_id`) 参照 `dage` (`id`)
)ENGINE=InnoDB デフォルト文字セット=latin1;

兄貴を挿入:

mysql> dage(name) に値('Causeway Bay') を挿入します。
クエリは正常、1 行が影響を受けました (0.01 秒)
mysql> dage から * を選択します。
+----+--------+
| ID | 名前 |
+----+--------+
| 1 | コーズウェイベイ |
+----+--------+
セット内の 1 行 (0.00 秒)

弟を挿入します:

mysql> xiaodi(dage_id,name) に値(1,'Causeway Bay_Little Brother A') を挿入します。
クエリは正常、1 行が影響を受けました (0.02 秒)

mysql> xiaodi から * を選択します。
+----+---------+--------------+
| id | 日付 ID | 名前 |
+----+---------+--------------+
| 1 | 1 | コーズウェイベイ_弟A |
+----+---------+--------------+

ビッグブラザーを削除します:

mysql> id=1 の dage から削除します。
エラー 1451 (23000): 親行を削除または更新できません: 外部キー制約が失敗しました (`bstar/xiaodi`、制約 `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))

ヒント: いいえ、制限があります。兄の下には弟がいるので、兄は私たちを見捨てることはできません。

新しい子を挿入します:

mysql> xiaodi(dage_id,name) に値 (2,'旺角_小弟A') を挿入します。              
エラー 1452 (23000): 子行を追加または更新できません: 外部キー制約が失敗しました (`bstar/xiaodi`、制約 `xiaodi_ibfk_1` FOREIGN KEY (`dage_id`) REFERENCES `dage` (`id`))

ヒント: 君は反抗したいんだね!君にはまだ兄がいないんだね!

外部キー制約にイベント トリガー制限を追加します。

mysql> show テーブル xiaodi を作成します。

 制約 `xiaodi_ibfk_1` 外部キー (`dage_id`) 参照 `dage` (`id`)

mysql> テーブル xiaodi を変更し、外部キー xiaodi_ibfk_1 を削除します。
クエリは正常、1 行が影響を受けました (0.04 秒)
レコード: 1 重複: 0 警告:
mysql> alter table xiaodi add foreign key(dage_id) references dage(id) on delete cascade on update cascade;
クエリは正常、1 行が影響を受けました (0.04 秒)
記録: 1 重複: 0 警告: 0

もう一度ビッグブラザーを削除してみます:

mysql> id=1 の dage から削除します。
クエリは正常、1 行が影響を受けました (0.01 秒)

mysql> dage から * を選択します。
空セット (0.01 秒)

mysql> xiaodi から * を選択します。
空のセット (0.00 秒)

おっと、今回は対応する弟がいなくなってしまった、仕方がない、誰が私に削除カスケード(カスケード制限)をオンにするように言ったんだ!

注意すべき点

  • テーブル名は対応していますか?
  • テーブル内のフィールドは対応していますか?
  • 外部キーに関連付けられたキーは別のテーブルの主キーですか?

MySQL の主キーと外部キーの使用と説明についての簡単な紹介はこれで終わりです。MySQL の主キーと外部キーに関するより詳しい情報については、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL の主キーと外部キーを理解するための簡単なチュートリアル
  • 主キー、外部キー、複合主キーを作成するための MySQL ステートメント
  • MySQL でデータ テーブルを作成し、主キーと外部キーの関係を確立する方法の詳細な説明

<<:  CSS フレックスレイアウトのリストの最後の行を左揃えにする N 通りの方法 (要約)

>>:  ファイルをアップロードするときに enctype フィールドを使用する理由は何ですか?

推薦する

Vue での this.$set の使用に関する詳細な説明

目次Vue での this.$set の使用使用なぜレスポンシブなのか?分析する要約するVue での...

CentOS 6 は Docker を使用して Redis マスター スレーブ データベース操作例を展開します

この記事では、Docker を使用して Centos6 に Redis マスター/スレーブ データベ...

オペレーターが知っておくべき 18 個の Nginx プロキシ キャッシュ構成のヒント (どれを知っていますか?)

アプリケーションや Web サイトのパフォーマンスが成功の重要な要素であることは誰もが知っています。...

フロントエンドネットワーク、JavaScriptの最適化、開発のヒントについて簡単に説明します。

1. ネットワークの最適化YSlowには23のルールがあります。これら数十のルールは、主に、不要な...

Unicode の一般的な文字の概要

初期のコンピューターのほとんどは ASCII 文字しか使用できませんでしたが、その後、主要な西洋のア...

Linux の権限管理コマンド (chmod/chown/chgrp/unmask) の詳細な説明

目次chmod例権限に関する特別な注意分析するチョーンchgrp umask Linux オペレーテ...

HTML のスクロールバーについて/スクロールバーの削除

1. xhtmlの下のスクロールバーの色元の HTML では、ページ全体のスクロール バーを次のよう...

MySQL におけるデータベース間関連クエリメソッド

ビジネスシナリオ: 異なるデータベース内のテーブルをクエリするたとえば、関連付けられるテーブルは、マ...

axiosのシンプルなカプセル化と使用例コード

序文最近、プロジェクトを構築しているときに、リクエストのカプセル化について考え、どのようにカプセル化...

CSS BEM 記述標準の詳細な説明

BEM は、Web 開発に対するコンポーネントベースのアプローチです。ユーザー インターフェイスを独...

VMware インストール エラー VMware Workstation が VMware 認証サービスを開始できませんでした

背景: SAP ECC サーバーをインストールし、XP をプレインストールしたいと考えています。XP...

Nginxはhttpとhttpsの両方のアクセスをサポートするために同じドメイン名を設定します

Nginx は同じドメイン名で構成されており、http と https の両方でアクセスできます。証...

JavaScript フロントエンドのタイムアウト非同期操作に最適なソリューション

目次コードの実行に長い時間がかかる場合はどうなりますか? Axiosにはタイムアウト処理機能が搭載さ...

CSS3 ボタン境界アニメーションの実装

まず効果を見てみましょう: html <a href="#"> &l...

MySQL MGR の利点は何ですか?

MGR (MySQL グループ レプリケーション) は、バージョン 5.7 で追加された新しい機能...