ホームページ >データベース >mysql チュートリアル >mysqlの外部キーとは何ですか

mysqlの外部キーとは何ですか

青灯夜游
青灯夜游オリジナル
2022-02-17 11:42:4522089ブラウズ

MySQL では、外部キーは 2 つのテーブルのデータ間のリンクを確立および強化するために使用される 1 つ以上の列であり、あるテーブルのフィールドが別のテーブルのフィールドによって参照されていることを示します。外部キーは関連テーブル内のデータに制限を設け、MySQL が参照整合性を維持できるようにします。

mysqlの外部キーとは何ですか

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

外部キーは主キーに対する相対キーです。

主キー (主キー) テーブル内の行を一意に識別する属性または属性グループ。テーブルには主キーを 1 つだけ含めることができますが、複数の候補インデックスを含めることができます。主キーは多くの場合、データの不整合を防ぐために外部キーと参照整合性制約を形成します。主キーにより、レコードが一意であり、主キー フィールドが空でないことを確認できます。データベース管理システムは主キーに対して一意のインデックスを自動的に生成するため、主キーも特別なインデックスになります。

外部キー (外部キー) は、2 つのテーブル データ間のリンクを確立および強化するために使用される 1 つ以上の列です。外部キーとは、あるテーブルのフィールドが別のテーブルのフィールドによって参照されることを意味します。外部キーは関連テーブル内のデータに制限を設け、MySQL が参照整合性を維持できるようにします。

外部キー制約は、主に 2 つのテーブル間のデータの一貫性を維持するために使用されます。つまり、テーブルの外部キーは別のテーブルの主キーであり、外部キーは 2 つのテーブルを接続します。通常の状況では、テーブル内の主キーを削除するには、まず他のテーブルに同一の外部キーがないことを確認する必要があります (つまり、テーブル内の主キーに外部キーが関連付けられていない)。

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

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

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

  • 主キーには 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 KEYREFERENCES で指定された子テーブルと親テーブルの列の数は同じである必要があります。
  • ON DELETE 句を使用すると、親テーブルのレコードが削除されたときに子テーブルのレコードがどのように操作を実行するかを定義できます。 ON DELETE 句を省略して親テーブルのレコードを削除すると、MySQL は子テーブルの関連データの削除を拒否します。さらに、MySQL には、ON DELETE CASCADE などの追加オプションを使用できるように、親テーブルのレコードを削除するときに、親テーブルのレコードを参照する子テーブルのレコードを削除できるいくつかの操作も用意されています。テーブル。子テーブル内の関連レコードを削除したくない場合は、代わりに ON DELETE SET NULL 操作を使用します。親テーブルのレコードが削除されると、子テーブルの外部キー カラムが NULL## を受け入れる必要がある場合、MySQL は子テーブルの外部キー カラム値を 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数据库和两个表:categoriesproducts。每个类别都有一个或多个产品,每个产品只属于一个类别。 products表中的cat_id字段被定义为具有UPDATE ON CASCADEDELETE 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_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外键

您还可以使用ALTER TABLE语句将外键删除,如下语句:

ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name;

在上面的声明中:

  • 首先,指定要从中删除外键的表名称。
  • 其次,将约束名称放在DROP FOREIGN KEY子句之后。

请注意,constraint_name是在创建或添加外键到表时指定的约束的名称。 如果省略它,MySQL会为您生成约束名称。

要获取生成的表的约束名称,请使用SHOW CREATE TABLE语句,如下所示:

SHOW CREATE TABLE table_name;

例如,要查看products表的外键,请使用以下语句:

SHOW CREATE TABLE products;

以下是语句的输出:

CREATE TABLE products (
  prd_id int(11) NOT NULL AUTO_INCREMENT,
  prd_name varchar(355) NOT NULL,
  prd_price decimal(10,0) DEFAULT NULL,
  cat_id int(11) NOT NULL,
  vdr_id int(11) NOT NULL,
  PRIMARY KEY (prd_id),
  KEY fk_cat (cat_id),
  KEY fk_vendor(vdr_id),

  CONSTRAINT products_ibfk_2 
  FOREIGN KEY (vdr_id) 
  REFERENCES vendors (vdr_id) 
  ON DELETE NO ACTION 
  ON UPDATE CASCADE,

  CONSTRAINT products_ibfk_1 
  FOREIGN KEY (cat_id) 
  REFERENCES categories (cat_id) 
  ON UPDATE CASCADE
) ENGINE=InnoDB;

products表有两个外键约束:products_ibfk_1products_ibfk_2

可以使用以下语句删除products表的外键:

ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_1;

ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_2;

MySQL禁用外键检查

有时,因为某种原因需要禁用外键检查(例如将CSV文件中的数据导入表中)非常有用。 如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。 但是,如果禁用外键检查,则可以按任何顺序加载导入数据。

除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。

要禁用外键检查,请使用以下语句:

SET foreign_key_checks = 0;

当然,可以使用以下语句启用它:

SET foreign_key_checks = 1;

【相关推荐:mysql视频教程

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。