定義:
MySQL外鍵約束(FOREIGN KEY)用來在兩個表的數據之間建立鏈接,它可以是一列或者多列。一個表可以有一個或多個外鍵。
外鍵對應的是參照完整性,一個表的外鍵可以為空值,若不為空值,則每一個外鍵的值必須等於另一個表中主鍵的某個值。
外鍵是表的一個字段,不是本表的主鍵,但對應另一個表的主鍵。定義外鍵后,不允許刪除另一個表中具有關聯關系的行。
外鍵的主要作用是保持數據的一致性、完整性。例如,部門表 tb_dept 的主鍵是 id,在員工表 tb_emp5 中有一個鍵 deptId 與這個 id 關聯。
- 主表(父表):對於兩個具有關聯關系的表而言,相關聯字段中主鍵所在的表就是主表。
- 從表(子表):對於兩個具有關聯關系的表而言,相關聯字段中外鍵所在的表就是從表。
外鍵約束字段的選取:
定義一個外鍵時,需要遵守下列規則:
- 父表必須已經存在於數據庫中,或者是當前正在創建的表。如果是后一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。
- 必須為父表定義主鍵。
- 主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。
- 在父表的表名后面指定列名或列名的組合。這個列或列的組合必須是父表的主鍵或候選鍵。
- 外鍵中列的數目必須和父表的主鍵中列的數目相同。
- 外鍵中列的數據類型必須和父表主鍵中對應列的數據類型相同。
設置外鍵約束:
1、創建表時添加外鍵約束
語法規則如下:
[CONSTRAINT <外鍵名>] FOREIGN KEY 字段名 [,字段名2,…]
REFERENCES <主表名> 主鍵列1 [,主鍵列2,…]
其中:<外鍵名>為定義的外鍵約束的名稱,一個表中不能有相同名稱的外鍵;<字段名>表示子表需要添加外健約束的字段列;<主表名>即被子表外鍵所依賴的表的名稱;<主鍵列>表示主表中定義的主鍵列或者列組合。
【實例 1】創建一個名為test_dept1的表作為父表
創建數據表 tb_emp6,並在表 tb_emp6 上創建外鍵約束,讓它的鍵 deptId 作為外鍵關聯到表 tb_dept1 的主鍵 id
fk_emp_dept1 為外鍵約束,外鍵名稱為 deptId,其依賴於表 tb_dept1 的主鍵 id。
提示:關聯指的是關系數據庫中,相關表之間的聯系。它是通過相同的屬性或屬性組來表示的。子表的外鍵必須關聯父表的主鍵,且關聯字段的數據類型必須匹配,如果類型不一樣,則創建子表時會出現錯誤“ERROR 1005(HY000):Can't create table'database.tablename'(errno:150)”。
2、在修改數據表時添加外鍵約束
語法規則為:
ALTER TABLE <數據表名> ADD CONSTRAINT <索引名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);
【實例 2】修改數據表 tb_emp3,將字段 deptId 設置為外鍵,與數據表 tb_dept1 的主鍵 id 進行關聯
同一個數據庫中的外鍵約束名稱不能重復,否則會報錯
刪除外鍵約束:
對於數據庫中定義的外鍵,如果不再需要,可以將其刪除。外鍵一旦刪除,就會解除主表和從表間的關聯關系,MySQL 中刪除外鍵的語法格式如下:
ALTER TABLE <表名> DROP FOREIGN KEY <外鍵約束名>;
【實例 3】刪除數據表 tb_emp3 中的外鍵約束 fk_em_dept1
刪除前:
刪除后:
tb_emp3 中已經不存在 FOREIGN KEY,原有的名稱為 fk_emp_dept 的外鍵約束刪除成功。