首頁 > 資料庫 > mysql教程 > mysql中什麼是外鍵

mysql中什麼是外鍵

青灯夜游
發布: 2022-02-17 16:04:19
原創
22082 人瀏覽過

在mysql中,外鍵是用來建立和加强两表資料之間的連結的一列或多列,它表示一個表中的一個欄位被另一個表中的一個欄位引用。外鍵對相關表中的資料造成了限制,使MySQL能夠保持參照完整性。

mysql中什麼是外鍵

本教學操作環境:windows7系統、mysql8版本、Dell G3電腦。

外鍵是相對主鍵而來的。

主鍵(primary key) 能夠唯一標識表中某一行的屬性或屬性組。一個表只能有一個主鍵,但可以有多個候選索引。主鍵常與外鍵構成參照完整性約束,防止資料不一致出現。主鍵可以保證記錄的唯一和主鍵域非空,資料庫管理系統對於主鍵自動產生唯一索引,所以主鍵也是一個特殊的索引。

外鍵(foreign key) 是用來建立和加強兩個表格資料之間的連結的一列或多列。外鍵表示一個表中的一個欄位被另一個表中的一個欄位引用。外鍵對相關表中的資料造成了限制,使MySQL能夠保持參照完整性。

外鍵約束主要用來維護兩個表之間資料的一致性。簡言之,表的外鍵就是另一表的主鍵,外鍵將兩表連結起來。一般情況下,要刪除一張表中的主鍵必須先確保其它表中的沒有相同外鍵(即該表中的主鍵沒有一個外鍵和它相關聯)。

#定義外鍵時,需要遵守下列規則:

  • #主表必須已經存在於資料庫中,或是目前正在建立的表。如果是後一種情況,則主表與從表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。

  • 必須為主表定義主鍵。

  • 主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。

  • 在主表的表名後面指定列名或列名的組合。這個列或列的組合必須是主表的主鍵或候選鍵。

  • 外鍵中列的數目必須和主表的主鍵中列的數目相同。

  • 外鍵中列的資料型別必須和主表主鍵中對應列的資料型別相同。

建立外鍵

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,當刪除父表中的記錄時,MySQL可以刪除子表中引用父表中記錄的記錄。如果您不希望刪除子表中的相關記錄,請改用ON DELETE SET NULL操作。當父表中的記錄被刪除時,MySQL會將子表中的外鍵列值設為NULL,條件是子表中的外鍵列必須接受NULL值。請注意,如果使用ON DELETE NO ACTIONON DELETE RESTRICT操作,MySQL將拒絕刪除。
  • ON UPDATE子句允許指定在父表中的行更新時,子表中的行會如何執行動作。當父表中的行被更新時,可以省略ON UPDATE子句讓MySQL拒絕對子表中的行的任何更新。 ON UPDATE CASCADE操作可讓您執行交叉表更新,並且當更新父表中的行時,ON UPDATE SET NULL操作會將子表中行中的值重設為NULL值。 ON UPDATE NO ACTIONUPDATE 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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板