Navicat 博客

MySQL 外键约束指南 2023 年 6 月 2 日,由 Robert Gravelle 撰写

在规范化过程中,会从较大或较中心的表中分离出可以代表不同实体的字段组,并将其移至单独的表中。然后使用公共字段(通常是 ID)来维持它们的关系。以下是一个示例:

film_id_fk (34K)

在关系数据库中,表之间的引用完整性是使用外键约束强制执行的。

本文将介绍外键的工作原理以及如何使用 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),然后点击“添加外键”按钮。这将在外键列表中创建一个新行:

new_fk_on_film_table (39K)

接下来,从“字段”下拉列表中选择“film”表,然后从“被引用的表”下拉列表中选择“inventory”表,并为“被引用的字段”选择“film_id”:

new_fk_on_film_table_with_fields_populated (44K)

下一步是选择“删除时”和“更新时”的橾作。MySQL 支持五种不同的引用选项,如下:

  • CASCADE:当我们从父表中删除或更新任何行时,子表中匹配行的值将被自动删除或更新。
  • SET NULL:当我们从父表中删除或更新任何行时,子表中的外键列的值会被设置为NULL。
  • RESTRICT:当我们从父表中删除或更新在引用(子)表中具有匹配行的任何行时,MySQL 不允许删除或更新父表中的行。
  • NO ACTION:类似于RESTRICT。但有一个不同之处,它会在尝试修改表后检查引用完整性。
  • SET DEFAULT:MySQL 解析器能识别此橾作。但是,InnoDB 和 NDB 表都拒绝此橾作。

让我们按照现有 FK 的示例,选择 RESTRICT 的“删除时”橾作和 CASCADE 的“更新时”橾作:

new_fk_on_film_table_with_action_fields_populated (46K)

最后,点击“保存”按钮创建新的外键约束。请注意,如果你没有填写“名称”字段,Navicat 会为你创建一个名称。

总结

外键在维持表之间的引用完整性方面起着至关重要的作用。因此,应该为每个表关系创建一个外键。而 Navicat 16 for MySQL 就能让你无需编写任何 SQL 命令即可轻松管理外键约束。

Navicat 文章
频道条目
分享
文章归档