mysqlは外部キーをサポートしていません

青灯夜游
リリース: 2022-06-27 12:00:07
オリジナル
2174 人が閲覧しました

Mysql は外部キーをサポートしています。 MySQL では、外部キーは主にマスター テーブルとスレーブ テーブル間の関係を確立するために使用され、2 つのテーブルのデータの接続を確立し、2 つのテーブルのデータの一貫性と完全性を制約できます。 table はレコードを削除します。それに応じて、テーブルの対応するレコードも変更する必要があります。テーブルには 1 つ以上の外部キーを含めることができ、外部キーは NULL 値にすることができます。NULL 値でない場合、各外部キーの値はメイン テーブルの主キーの特定の値と等しくなければなりません。外部キーの列数と対応するデータ型はメインテーブルの主キーと同じである必要があります。

mysqlは外部キーをサポートしていません

このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。

mysql は外部キーをサポートしています。

MySQL 外部キー (FOREIGN KEY)

外部キーは、指定されたテーブル内のフィールドであり、別のテーブルの別のフィールドと一致します。テーブルフィールド。外部キーは関連テーブル内のデータに制約を設定するため、MySQL は参照整合性を維持できます。

外部キーは、マスター テーブルとスレーブ テーブル間の関連付けを確立し、2 つのテーブルのデータの接続を確立し、2 つのテーブルのデータの一貫性と整合性を制約するために使用されます。

関連付けられたリレーションシップを持つ 2 つのテーブルの場合、関連付けられたフィールドの主キーが配置されているテーブルがメイン テーブル (親テーブル) となり、外部キーが配置されているテーブルがセカンダリ テーブルになります。テーブル(子テーブル)。

レコードがメイン テーブルから削除されると、それに応じてテーブルの対応するレコードも変更する必要があります。テーブルには 1 つ以上の外部キーを含めることができ、外部キーは null にすることもできます。null でない場合、各外部キーの値はメイン テーブルの主キーの特定の値と等しくなければなりません。

サンプル データベースから次のデータベース図を見てみましょう。

mysqlは外部キーをサポートしていません

顧客と注文という 2 つのテーブルがあります。各顧客には 0 個以上の注文があり、各注文は 1 人の顧客にのみ属することができます。 Customers テーブルと Orders テーブルの関係は 1 対多で、customerNumber フィールドで指定されたテーブル内の外部キーによって注文が確立されます。 Customers テーブルの customerNumber フィールドは、orders テーブルの customerNumber 主キー フィールドに関連付けられています。

customers テーブルは親テーブルまたは参照テーブルと呼ばれ、orders テーブルは子テーブルまたは参照テーブルと呼ばれます。

外部キーには、列または列のグループを指定できます。子テーブルの列は通常、親テーブルの主キー列を参照します。

テーブルには複数の外部キーを持つことができ、子テーブルの各外部キーは異なる親テーブルを参照できます。

子テーブルの行には、親テーブルに存在する値が含まれている必要があります。たとえば、orders テーブルの各注文レコードには、customers テーブル customerNumber に存在する値が含まれている必要があります。したがって、複数の注文が同じ顧客を参照することができ、この関係は 1 (顧客) 対多 (注文) または 1 対多と呼ばれます。

子テーブルと親テーブルが同じである場合があります。外部キーは、テーブルの主キーを参照します。たとえば、次のemployees テーブル:

mysqlは外部キーをサポートしていません

reportTo 列は、employeeNumber を列として参照する外部キーです。従業員テーブルの主キーは従業員数を反映します。従業員間のレポート構造、つまり各従業員が別の従業員に直属し、従業員はゼロ個以上の直属の部下を持つことができます。このようなテーブルに対してデータをクエリするのに役立つ自己結合に関するチュートリアルがあります。

reportTo 外部キーは、再帰的または自己参照外部キーとも呼ばれます。

外部キーは参照整合性を強制し、データの一貫性と整合性を自動的に維持するのに役立ちます。たとえば、存在しない顧客に対して注文を作成することはできません。

さらに、customerNumber 外部キーの削除操作にカスケードを設定して、customers テーブルで顧客が削除されると、その顧客に関連付けられているすべての注文も削除されるようにすることができます。これにより、複数の DELETE ステートメントまたは DELETE JOIN ステートメントを使用する時間と労力が節約されます。

削除と同様に、更新操作で customerNumber 外部キーのカスケードを定義して、複数の UPDATE ステートメントまたは UPDATE JOIN ステートメントを使用せずにテーブル間の更新を実行することもできます。

注: MySQL では、InnoDB ストレージ エンジンが外部キーをサポートしているため、外部キー制約を使用するには InnoDB テーブルを作成する必要があります。

mysql が外部キーを定義するときは、次の規則に従う必要があります。

  • メイン テーブルは、データベース、または作成中の現在のテーブルである必要があります。後者の場合、マスターテーブルとスレーブテーブルは同一のテーブルとなり、このようなテーブルを自己参照テーブルと呼び、この構造を自己参照整合性と呼びます。

  • メインテーブルには主キーを定義する必要があります。

  • 主キーには null 値を含めることはできませんが、外部キーでは null 値が許可されます。つまり、外部キーのすべての非 null 値が指定された主キーに出現する限り、外部キーの内容は正しいことになります。

  • メインテーブルのテーブル名の後に列名または列名の組み合わせを指定します。この列または列の組み合わせは、メイン テーブルの主キーまたは候補キーである必要があります。

  • 外部キーの列数は、メイン テーブルの主キーの列数と同じである必要があります。

  • 外部キーの列のデータ型は、メイン テーブルの主キーの対応する列のデータ型と同じである必要があります。

テーブルの外部キーを作成する

MySQL が外部キーを作成する構文

次の構文は、次の構文について説明します。 CREATE TABLE で外部キーを作成する方法 ステートメント内の子テーブルに外部キーを定義します。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action
ログイン後にコピー

構文を詳しく見てみましょう:

  • CONSTRAINT 句を使用すると、外部キー制約の制約名を定義できます。省略すると、MySQL が自動的に名前を生成します。

  • FOREIGN KEY 句は、親テーブルの主キー列を参照する子テーブルの列を指定します。 FOREIGN KEY 句の後に外部キー名を置くことも、MySQL に名前を作成させることもできます。 MySQL は、foreign_key_name 名を使用してインデックスを自動的に作成することに注意してください。

  • REFERENCES 句は、親テーブルと、子テーブルの列によって参照される列を指定します。指定した子テーブルと親テーブルの FOREIGN KEY および REFERENCES の列数は同じである必要があります。

  • ON DELETE 句を使用すると、親テーブルのレコードが削除されるときに、子テーブルのレコードの内容を定義できます。 ON DELETE 句を省略し、子テーブルのレコードを含む親テーブルのレコードを削除すると、MySQL は削除を拒否します。さらに、MySQL には、子テーブルのレコードを削除するように MySQL に要求する ON DELETE CASCADE などの追加オプションを使用できるアクションも用意されています。親テーブルのレコードが削除されると、そのレコードは次のレコードを参照します。親テーブル。子テーブル内の関連レコードを削除したくない場合は、代わりに ON DELETE SET NULL 操作を使用します。 MySQL は、親テーブルのレコードを削除するときに、子テーブルの外部キー カラム値を NULL に設定しますが、子テーブルの外部キー カラムが NULL 値を受け入れることが条件となります。 ON DELETE NO ACTION または ON DELETE RESTRICT オペレーションを使用した場合、MySQL は削除を拒否することに注意してください。

  • ON UPDATE 句を使用すると、親テーブルの行が更新されたときに子テーブルの行に何が起こるかを指定できます。 ON UPDATE 句を省略すると、MySQL が親テーブルの行を更新するときに子テーブルの行への更新を拒否するようにできます。 ON UPDATE CASCADE 操作を使用すると、テーブル間の更新を実行でき、親テーブルの行が ON UPDATE SET NULL で更新されると、この操作により子テーブルの行の値が値 NULL にリセットされます。 ON UPDATE NO ACTION または UPDATE RESTRICT アクションで更新を拒否します。

MySQL テーブル外部キーの作成例

次の例では、dbdemo データベースと 2 つのテーブル (カテゴリと製品) を作成します。各カテゴリには 1 つまたはより多くの製品があり、各製品は 1 つのカテゴリにのみ属します。 products テーブルの cat_id フィールドは、UPDATE ON CASCADE および DELETE ON RESTRICT 操作を使用する外部キーとして定義されます。

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
   cat_id int not null auto_increment primary key,
   cat_name varchar(255) not null,
   cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
   prd_id int not null auto_increment primary key,
   prd_name varchar(355) not null,
   prd_price decimal,
   cat_id int not null,
   FOREIGN KEY fk_cat(cat_id)
   REFERENCES categories(cat_id)
   ON UPDATE CASCADE
   ON DELETE RESTRICT
)ENGINE=InnoDB;
ログイン後にコピー

外部キーをテーブルに追加します

MySQL の外部キー構文を追加します

To To既存のテーブルに外部キーを追加するには、上記の外部キー定義構文で ALTER TABLE ステートメントを使用します。

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;
ログイン後にコピー

MySQL 外部キーの追加の例

次に、ベンダーという新しいテーブルを追加し、ベンダー ID フィールドを含むように製品テーブルを変更します。

USE dbdemo;
 
CREATE TABLE vendors(
    vdr_id int not null auto_increment primary key,
    vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;
ログイン後にコピー

外部キー製品をテーブルに追加するには、次のステートメントを使用します。

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;
ログイン後にコピー

mysqlは外部キーをサポートしていませんここで、products テーブルには 2 つの外部キーがあり、1 つはカテゴリ テーブルを参照し、もう 1 つはベンダー テーブルを参照します。

[関連する推奨事項: mysql ビデオ チュートリアル ]

以上がmysqlは外部キーをサポートしていませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート