MySQL Foreign Key

2025年3月17日 | 阅读 7 分钟

外键用于将一个或多个表链接在一起。它也称为引用键。外键匹配另一个表的主键字段。这意味着一个表中的外键字段引用另一个表的主键字段。它唯一标识另一个表中的每一行,从而在 MySQL 中维护参照完整性

外键使得在表之间创建父子关系成为可能。在此关系中,父表保存初始列值,子表的列值引用父列值。MySQL 允许我们在子表上定义外键约束。

MySQL 通过两种方式定义外键

  1. 使用 CREATE TABLE 语句
  2. 使用 ALTER TABLE 语句

语法

以下是用于在 MySQL 中使用 CREATE TABLE 或 ALTER TABLE 语句定义外键的基本语法

在上述语法中,我们可以看到以下参数

constraint_name:指定外键约束的名称。如果我们没有提供约束名称,MySQL 会自动生成其名称。

col_name:这是我们将要设为外键的列的名称。

parent_tbl_name:指定父表的名称,后跟引用外键列的列名。

Refrence_option:用于确保外键如何通过父表和子表之间的 ON DELETE 和 ON UPDATE 子句来维护参照完整性。

MySQL 包含五种不同的参照选项,如下所示

CASCADE:当我们从父表中删除或更新任何行时,子表中匹配的行的值将自动删除或更新。

SET NULL:当我们从父表中删除或更新任何行时,子表中的外键列的值将设置为 NULL。

RESTRICT:当我们从具有在引用(子)表中的匹配行的父表中删除或更新任何行时,MySQL 不允许删除或更新父表中的行。

NO ACTION:它类似于 RESTRICT。但它有一个区别,即它在尝试修改表后检查参照完整性。

SET DEFAULT:MySQL 解析器识别此操作。但是,InnoDB 和 NDB 表都拒绝此操作。

注意:MySQL 主要为 CASCADE、RESTRICT 和 SET NULL 操作提供全面支持。如果我们没有指定 ON DELETE 和 ON UPDATE 子句,MySQL 将默认执行 RESTRICT 操作。

外键示例

让我们了解外键在 MySQL 中的工作原理。首先,我们将创建一个名为“mysqltestdb”的数据库并使用以下命令开始使用它

接下来,我们需要使用以下语句创建两个名为“customer”和“contact”的表

表:customer

表:contact

表结构验证

在这里,我们将使用以下查询查看数据库结构

我们将获得如下结构

MySQL Foreign Key

在上面的输出中,我们可以看到 customer 表的 key 列中的PRI表示该字段是主索引值。接下来,contact 值中 key 列的MUL表示Customer_Id字段可以存储具有相同值的多行。

向表中插入数据

现在,我们需要向两个表中插入记录。执行此语句将数据插入 customer 表

插入后,执行 SELECT TABLE 命令以查看 customer 表数据,如下所示

MySQL Foreign Key

执行以下 insert 语句将数据添加到 contact 表

我们的 contact 表看起来如下

MySQL Foreign Key

现在,让我们看看 MySQL 中的外键如何保持数据完整性。

因此,在这里,我们将删除引用数据,该数据将从两个表中删除记录。我们在 contact 表中定义了外键

这意味着如果我们从 customer 表中删除任何客户记录,那么 contact 表中相关的记录也应该被删除。并且 ON UPDATE CASCADE 将自动更新父表到子表中的引用字段(此处是 Customer_Id)。

执行此语句,该语句将删除名为JOHN的表中的记录。

再次查看我们的表,我们可以看到两个表都已更改。这意味着名称为 JOHN 的字段将从两个表中完全删除。

MySQL Foreign Key

现在,测试ON UPDATE CASCADE。在这里,我们将 contact 表中Mary的 Customer_Id 更新为

再次查看我们的表,我们可以看到两个表都已使用 Mary 的 Customer_Id=3 进行了更改。

MySQL Foreign Key

使用 SET NULL 操作的外键示例

在这里,我们将理解 SET NULL 操作如何与外键一起工作。首先,我们需要创建两个名为PersonsContacts的表,如下所示

表:Persons

表:Customers

接下来,我们需要使用以下语句将数据插入两个表中


现在,更新“Persons”表中的 ID

最后,使用以下 SELECT 语句验证更新

MySQL Foreign Key

如果我们查看我们的表,我们可以看到两个表都已更改。由于 ON UPDATE SET NULL 操作,Contacts 表中 Person_Id=3 的行已自动设置为NULL

如何删除外键

MySQL 允许使用 ALTER TABLE 语句从表中删除现有外键。以下语法用于删除外键

这里,table_name是我们从中删除外键的表的名称。constraint_name是创建表时添加的外键的名称。

如果我们不知道表中现有外键的名称,请执行以下命令

它将产生如下输出,我们可以看到表 contact 有一个名为 fk_customer 的外键,显示在红色矩形中。

MySQL Foreign Key

现在,要从 contact 表中删除此外键约束,请执行以下语句

我们可以使用 SHOW CREATE TABLE 语句来验证外键约束是否已删除。它将产生如下输出,我们可以看到外键不再存在于 contact 表中。

MySQL Foreign Key

使用 ALTER TABLE 语句定义外键

此语句允许我们对现有表进行修改。有时需要为现有表的列添加外键,然后使用此语句为该列添加外键。

语法

以下是使用 ALTER TABLE 语句将外键添加到现有表的语法

当使用 ALTER TABLE 语句添加外键时,建议首先在由外键引用的列上创建索引

示例

以下语句创建两个表“Person”和“Contact”,而不在表定义中包含外键列。

表:Person

表:Contact

创建表后,如果想为现有表添加外键,则需要执行以下 ALTER TABLE 语句

外键检查

MySQL 有一个特殊变量foreign_key_cheks来控制表中的外键检查。默认情况下,它已启用,以便在对表进行正常操作期间强制执行参照完整性。此变量是动态的,因此它同时支持全局和会话范围。

有时需要禁用外键检查,这在以下情况下非常有用

  • 我们删除了一个被外键引用的表。
  • 我们正在从 CSV 文件将数据导入表中。这可以加快导入操作。
  • 我们对具有外键的表使用 ALTER TABLE 语句。
  • 我们可以按任何顺序执行 load data 操作到表中,以避免外键检查。

以下语句允许我们禁用外键检查

以下语句允许我们启用外键检查


下一主题MySQL 复合键