mysql支不支援外來鍵

2022-06-27 14:02:25

mysql支援外來鍵。在MySQL中,外來鍵主要用來建立主表與從表的關聯關係,可以為兩個表的資料建立連線,約束兩個表中資料的一致性和完整性;當主表刪除某條記錄時,從表中與之對應的記錄也必須有相應的改變。一個表可以有一個或多個外來鍵,外來鍵可以為空值,若不為空值,則每一個外來鍵的值必須等於主表中主鍵的某個值;且外來鍵中列的數目和對應資料型別必須和主表的主鍵中的相同。

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

mysql支援外來鍵。

MySQL外來鍵(FOREIGN KEY)

外來鍵是指定表中與另一個表的另一個欄位匹配的欄位。外來鍵對相關表中的資料設定了約束,這使MySQL能夠保持參照完整性。

外來鍵用來建立主表與從表的關聯關係,為兩個表的資料建立連線,約束兩個表中資料的一致性和完整性。

對於兩個具有關聯關係的表而言,相關聯欄位中主鍵所在的表就是主表(父表),外來鍵所在的表就是從表(子表)。

主表刪除某條記錄時,從表中與之對應的記錄也必須有相應的改變。一個表可以有一個或多個外來鍵,外來鍵可以為空值,若不為空值,則每一個外來鍵的值必須等於主表中主鍵的某個值。

我們來看看範例資料庫中的以下資料庫圖。

1.png

我們有兩個表:customers和orders, 每個客戶都有零個或多個訂單,每個訂單隻能屬於一個客戶。customers表和orders表之間的關係是一對多的,它orders由customerNumber欄位指定的表中的外來鍵建立。customers表中的customerNumber欄位與orders表中的customerNumber主鍵欄位相關 。

customers 表稱為父表或參照表,orders表稱為子表或參照表。

外來鍵可以是一個列或一組列。子表中的列通常參照父表中的主鍵列。

表可以具有多個外來鍵,子表中的每個外來鍵可以參照不同的父表。

子表中的行必須包含父表中存在的值,例如,orders表中的每個訂單記錄必須具有customers表customerNumber中存在的值。因此,多個訂單可以參照同一個客戶,這種關係稱為一個(客戶)到多個(訂單)或一對多。

有時,子表和父表是相同的。外來鍵參照表的主鍵,例如,下employees表:

2.png

reportTo列是一個外來鍵,它參照employeeNumber作為employees表的主鍵的列,以反映員工之間的彙報結構,即每個員工向另一個員工彙報,員工可以有零個或多個直接彙報。我們有一個關於自聯接教學可以幫助您根據這種表查詢資料。

reportTo外來鍵也被稱為遞迴或自參照的外來鍵。

外來鍵強制執行參照完整性,可幫助您自動維護資料的一致性和完整性。例如,您無法為不存在的客戶建立訂單。

此外,您可以customerNumber在外來鍵的刪除操作上設定級聯,以便在刪除customers表中的客戶時,也會刪除與客戶關聯的所有訂單。這節省了使用多個DELETE語句 或DELETE JOIN語句的時間和精力。

與刪除相同,您還可以在更新操作上為customerNumber外來鍵定義級聯,以便在不使用多個UPDATE語句或UPDATE JOIN語句的情況下執行跨表更新。

注意:在MySQL中,InnoDB 儲存引擎支援外來鍵,因此您必須建立InnoDB表才能使用外來鍵約束。

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 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;

3.png現在,products表有兩個外來鍵,一個參照categories表,另一個參照vendors表。

【相關推薦:】

以上就是mysql支不支援外來鍵的詳細內容,更多請關注TW511.COM其它相關文章!