MySQL之外鍵約束(FOREIGN KEY)


定義:

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 的外鍵約束刪除成功。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM