MySQL外鍵的個人理解


問題起因:

這幾天在建表的時候遇到的問題,想試一試插入一下外鍵,結果折騰了半天,找了不少資料,鬧了不少笑話。如果文章寫的有問題,請及時指正我的錯誤,謝謝了。

問題描述:

錯誤理解:原來我一直以為,兩個表只要存在相同的列就可以把他設成外鍵,這個想法是錯誤的。

問題解決:

查了不少的資料,外鍵約束(FOREIGN KEY)用來在兩個表的數據之間建立鏈接,它可以是一列或者多列。一個表可以有一個或多個外鍵。

外鍵對應的是參照完整性,一個表的外鍵可以為空值,若不為空值,則每一個外鍵的值必須等於另一個表中主鍵的某個值

外鍵是表的一個字段,不是本表的主鍵,但對應另一個表的主鍵。定義外鍵后,不允許刪除另一個表中具有關聯關系的行。

外鍵的主要作用是保持數據的一致性、完整性。例如,部門表 tb_dept 的主鍵是 id,在員工表 tb_emp5 中有一個鍵 deptId 與這個 id 關聯。

  • 主表(父表):對於兩個具有關聯關系的表而言,相關聯字段中主鍵所在的表就是主表。
  • 從表(子表):對於兩個具有關聯關系的表而言,相關聯字段中外鍵所在的表就是從表。

注解:

  1.很多地方使用3個表來嘗試說明外鍵,這很容易讓人產生外鍵是3個表之間的關系(我昨天就陷入過這樣的一個誤區),實際上外鍵約束(FOREIGN KEY)用來在兩個表的數據之間建立鏈接。

  2.每一個外鍵的值必須等於另一個表中主鍵的某個值。外鍵是表的一個字段,不是本表的主鍵,但對應另一個表的主鍵。這個問題昨天的也犯了,設想一下,如果“表1”的的一個列既是主鍵又是外鍵,而這個外鍵約束又對應另一個表“表2”的主鍵,那么是不是“表1”的主鍵就是“表2”的主鍵呢?!,那么“表1”和“表2”就可以合並起來了。在我昨天的設計中,我想專門用一個表專門放用戶的賬號和密碼,並且有一個“uid”的列作為主鍵,另一張表放用戶的各種各樣的信息,同樣也是“uid作為主鍵”,很明顯這兩張表可以合並成一張表,而卻我想用外鍵連接他們2333;

選取設置 MySQL 外鍵約束的字段

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

    • 父表必須已經存在於數據庫中,或者是當前正在創建的表。如果是后一種情況,則父表與子表是同一個表,這樣的表稱為自參照表,這種結構稱為自參照完整性。
    • 必須為父表定義主鍵。
    • 主鍵不能包含空值,但允許在外鍵中出現空值。也就是說,只要外鍵的每個非空值出現在指定的主鍵中,這個外鍵的內容就是正確的。
    • 在父表的表名后面指定列名或列名的組合。這個列或列的組合必須是父表的主鍵或候選鍵。
    • 外鍵中列的數目必須和父表的主鍵中列的數目相同。
    • 外鍵中列的數據類型必須和父表主鍵中對應列的數據類型相同。

 

問題延伸:

在navcat創建外鍵的時候,這里有個選項,就順手查了一下他們的含義。

這里提供了幾個參數值,他們分別是  

 1. CASCADE: 從父表中刪除或更新對應的行,同時自動的刪除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

  2. SET NULL: 從父表中刪除或更新對應的行,同時將子表中的外鍵列設為空。注意,這些在外鍵列沒有被設為NOT NULL時才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

  3. NO ACTION: InnoDB拒絕刪除或者更新父表。

  4. RESTRICT: 拒絕刪除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE選項的效果是一樣的。

  5. SET DEFAULT: InnoDB目前不支持。

  外鍵約束使用最多的兩種情況無外乎:

  1)父表更新時子表也更新,父表刪除時如果子表有匹配的項,刪除失敗;

  2)父表更新時子表也更新,父表刪除時子表匹配的項也刪除。

  前一種情況,在外鍵定義中,我們使用ON UPDATE CASCADE ON DELETE RESTRICT;后一種情況,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

 

參考文章:這里有外鍵更詳細的描述: http://c.biancheng.net/view/2441.html

     這里有外鍵使用的條件和三個參數的詳細使用 https://blog.csdn.net/sky_100/article/details/52781434

希望可以幫到你,兄弟!

 


免責聲明!

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



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