在正規化的過程中,會從較大或較中心的資料表中分離出可以代表不同實體的欄位組,並將其移至單獨的資料表中。通常使用共同欄位(通常是 ID)來維持它們之間的關係。以下是一個範例:
在關聯式資料庫中,資料表之間的參考完整性是使用外部索引鍵約束條件強制執行的。
本文將介紹外部索引鍵的工作原理以及如何使用 Navicat 16 for MySQL 在 MySQL 中建立外部索引鍵約束條件。
關於電影和庫存之間的關係
我們在簡介中看到的模型描述了 film 和 inventory 資料表之間的一對多關係,即一個 film 實體(1 列)可以連結至 inventory 資料表中的零個或多個實體(列)。
film 資料表被稱為父資料表或受參考的資料表,inventory 表則被稱為子資料表或參考資料表。因此,子資料表的外部索引鍵欄通常參照父資料表的主索引鍵欄。
在這個例子中,我們只將焦點放在一個關係。實際上,一個資料表可以有多個外部索引鍵,每個外部索引鍵都可以參照不同父資料表的主索引鍵。
一旦設置了外部索引鍵條件約束,子資料表的外部索引鍵欄必須在父資料表的主索引鍵欄中具有對應的列,或者這些外部索引鍵欄的值必須為 NULL。例如,inventory 資料表中的每一列都有一個 film_id,它存在於 film 資料表的 film_id 欄中。inventory 資料表中的多列可以有相同的 film_id。
在下一節中,我們將在 Navicat 16 for MySQL 中為這個關係建立一個外部索引鍵約束條件。
在 Navicat 中建立外部索引鍵約束條件
在 Navicat 中,你可以在「資料表設計器」的「外部索引鍵」索引標籤中找到外部索引鍵條件約束。若要建立新的外部索引鍵條件約束,請以「資料表設計器」開啟父資料表(在這個例子中是 film),然後按一下「加入外部索引鍵」按鈕。這將在外部索引鍵清單中建立一個新列:
接下來,從「欄位」下拉式清單中選取「film」資料表,然後從「受參考的資料表」下拉式清單中選取「inventory」資料表,並在「受參考的欄位」中選取「film_id」:
下一步是選擇「刪除時」和「更新時」的動作。MySQL 支援五種不同的參考選項,如下所示:
- CASCADE:當我們從父資料表中刪除或更新任何列時,子資料表中的相符列的值將自動被刪除或更新。
- SET NULL:當我們從父資料表中刪除或更新任何列時,子資料表中的外部索引鍵欄的值會被設定為NULL。
- RESTRICT:當我們從父資料表中刪除或更新在參考(子)資料表中具有相符列的任何列時,MySQL 不允許刪除或更新父資料表中的列。
- NO ACTION:與 RESTRICT 類似,但有一個區別,它在嘗試修改資料表後檢查參考完整性。
- SET DEFAULT:MySQL 解析器能識別這個動作。但是,InnoDB 和 NDB 資料表都拒絕這個動作。
讓我們跟隨現有的 FK 的例子,選擇 RESTRICT 的「刪除時」動作以及 CASCADE 的「更新時」動作:
最後,按一下「儲存」按鈕以建立新的外部索引鍵條件約束。請注意,如果你沒有填寫「名稱」欄位,Navicat 會為你建立一個名稱。
總結
外部索引鍵在維持資料表之間的參考完整性方面發揮著至關重要的作用。因此,每個資料表關係都應該建立一個外部索引鍵。使用 Navicat 16 for MySQL ,你就可以輕鬆管理你的外部索引鍵條件約束,而無需編寫任何 SQL 命令。