Mysql には外部キーがあり、主にマスター テーブルとスレーブ テーブル間の関係を確立するために使用され、2 つのテーブル内のデータの接続を確立し、テーブル内のデータの一貫性と整合性を制約できます。 2つのテーブル。メイン テーブルからレコードが削除されると、それに応じてスレーブ テーブルの対応するレコードも変更する必要があります。テーブルには 1 つ以上の外部キーを持つことができます。外部キーには NULL 値を指定できます。NULL 値でない場合、各外部キーの値は、メイン テーブルの主キーの特定の値、およびメイン テーブルの列の数と対応するデータ型に等しい必要があります。外部キーはメインテーブルの主キーと同じである必要があります。
このチュートリアルのオペレーティング システム: Windows 10 システム、mysql バージョン 8.0、Dell G3 コンピューター。
mysql には外部キーがあります。
MySQL 外部キー (FOREIGN KEY)
外部キーは、別のテーブルの別のフィールドと一致する、指定されたテーブル内のフィールドです。外部キーは関連テーブル内のデータに制約を設定するため、MySQL は参照整合性を維持できます。
外部キーは、マスター テーブルとスレーブ テーブル間の関連付けを確立し、2 つのテーブルのデータの接続を確立し、2 つのテーブルのデータの一貫性と整合性を制約するために使用されます。
関連付けられたリレーションシップを持つ 2 つのテーブルの場合、関連付けられたフィールドの主キーが配置されているテーブルがメイン テーブル (親テーブル) であり、外部キーが配置されているテーブルが副テーブル (子テーブル) です。テーブル)。
レコードがメイン テーブルから削除されると、それに応じてテーブルの対応するレコードも変更する必要があります。テーブルには 1 つ以上の外部キーを含めることができ、外部キーは null にすることもできます。null でない場合、各外部キーの値はメイン テーブルの主キーの特定の値と等しくなければなりません。
サンプル データベースからの次のデータベース図を見てみましょう。
顧客と注文という 2 つのテーブルがあります。各顧客には 0 個以上の注文があり、各注文は 1 人の顧客にのみ属することができます。 Customers テーブルと Orders テーブルの関係は 1 対多で、customerNumber フィールドで指定されたテーブル内の外部キーによって注文が確立されます。 Customers テーブルの customerNumber フィールドは、orders テーブルの customerNumber 主キー フィールドに関連付けられています。
customers テーブルは親テーブルまたは参照テーブルと呼ばれ、orders テーブルは子テーブルまたは参照テーブルと呼ばれます。
外部キーには、列または列のグループを指定できます。子テーブルの列は通常、親テーブルの主キー列を参照します。
テーブルには複数の外部キーを持つことができ、子テーブルの各外部キーは異なる親テーブルを参照できます。
子テーブルの行には、親テーブルに存在する値が含まれている必要があります。たとえば、orders テーブルの各注文レコードには、customers テーブル customerNumber に存在する値が含まれている必要があります。したがって、複数の注文が同じ顧客を参照することができ、この関係は 1 (顧客) 対多 (注文) または 1 対多と呼ばれます。
子テーブルと親テーブルが同じである場合があります。外部キーは、テーブルの主キーを参照します。たとえば、次のemployees テーブル:
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还为您提供操作,以便您可以使用其他选项,例如ON DELETE CASCADE ,要求MySQL删除子表中的记录,当父表中的记录被删除时,记录将引用父表中的记录。如果您不希望删除子表中的相关记录,请改用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数据库和两个表:categories和 products.每个类别具有一个或多个产品和每个产品只属于一个类别。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添加外键语法
要将外键添加到现有表,请使用带有上述外键定义语法的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添加外键示例
现在,让我们添加一个名为vendors的新表,并更改products表以包含供应商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;
要向表中添加外键products,请使用以下语句:
ALTER TABLE products ADD FOREIGN KEY fk_vendor(vdr_id) REFERENCES vendors(vdr_id) ON DELETE NO ACTION ON UPDATE CASCADE;
现在,products表有两个外键,一个引用categories表,另一个引用vendors表。
以上がmysqlには外部キーがありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。