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 フィールドを使用する理由は何ですか?

推薦する

SQLシリアル番号取得コード例

この記事は主にSQLシリアル番号取得コード例を紹介します。記事ではサンプルコードを詳細に紹介しており...

上部の固定divは半透明効果に設定できます

コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...

要素UIポップアップコンポーネントをカプセル化する手順

el-dialogをコンポーネントとしてカプセル化するelement-ui を使用する場合、ポップア...

Nginx リクエスト制限の設定方法

Nginx は、多くの優れた機能を備えた強力で高性能な Web およびリバース プロキシ サーバーで...

node.js でマルチコア CPU を最大限に活用する方法

目次概要node.js でマルチコア CPU を最大限に活用する方法Node で子プロセスを作成する...

ミニプログラムはミニプログラムクラウドを使用してWeChatの支払い機能を実装します

目次1. WeChat Payを開く1.1 アフィリエイト加盟店番号1.2 加盟店番号を追加する1....

MySQLが数十億のトラフィックをサポートする方法

目次1 マスター・スレーブの読み取り・書き込み分離1.1 コア2 マスタースレーブレプリケーション2...

MySQL 全体または単一のテーブルデータのエクスポート

単一のテーブルをエクスポートするmysqldump -u ユーザー -p db名 テーブル名 >...

Centos6.5 でのスーパーバイザーのアップグレード、インストール、および構成に関するチュートリアル

スーパーバイザー紹介Supervisor は、Python で開発されたクライアント/サーバー サー...

Centos は chrony 時間同期サーバー プロセス図を構築します

私の環境: 3 centos7.5 1804マスター 192.168.100.140ノード1 192...

アイデア展開Tomcatサービス実装プロセス図

まずプロジェクトの成果物を構成するスタートアップ項目の設定 Tomcatサービスを作成する開始したい...

PHP環境構築におけるDockerの柔軟な実装

Docker を使用して、柔軟なオンライン PHP 環境を構築します。場合によっては、他の人がすでに...

Apache Tika を使用してファイルが破損しているかどうかを検出する方法

Apache Tika は、さまざまな形式のファイルからファイル タイプを検出し、コンテンツを抽出す...

...

HTML ではスペースはどのように表現されますか (どのような意味ですか)?

Web 開発では、次のような文字によく遭遇します: &nbsp;これは実際には HTML が...