MySQL Foreign Key2025年3月17日 | 阅读 7 分钟 外键用于将一个或多个表链接在一起。它也称为引用键。外键匹配另一个表的主键字段。这意味着一个表中的外键字段引用另一个表的主键字段。它唯一标识另一个表中的每一行,从而在 MySQL 中维护参照完整性。 外键使得在表之间创建父子关系成为可能。在此关系中,父表保存初始列值,子表的列值引用父列值。MySQL 允许我们在子表上定义外键约束。 MySQL 通过两种方式定义外键
语法以下是用于在 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 表结构验证在这里,我们将使用以下查询查看数据库结构 我们将获得如下结构 ![]() 在上面的输出中,我们可以看到 customer 表的 key 列中的PRI表示该字段是主索引值。接下来,contact 值中 key 列的MUL表示Customer_Id字段可以存储具有相同值的多行。 向表中插入数据现在,我们需要向两个表中插入记录。执行此语句将数据插入 customer 表 插入后,执行 SELECT TABLE 命令以查看 customer 表数据,如下所示 ![]() 执行以下 insert 语句将数据添加到 contact 表 我们的 contact 表看起来如下 ![]() 现在,让我们看看 MySQL 中的外键如何保持数据完整性。 因此,在这里,我们将删除引用数据,该数据将从两个表中删除记录。我们在 contact 表中定义了外键 这意味着如果我们从 customer 表中删除任何客户记录,那么 contact 表中相关的记录也应该被删除。并且 ON UPDATE CASCADE 将自动更新父表到子表中的引用字段(此处是 Customer_Id)。 执行此语句,该语句将删除名为JOHN的表中的记录。 再次查看我们的表,我们可以看到两个表都已更改。这意味着名称为 JOHN 的字段将从两个表中完全删除。 ![]() 现在,测试ON UPDATE CASCADE。在这里,我们将 contact 表中Mary的 Customer_Id 更新为 再次查看我们的表,我们可以看到两个表都已使用 Mary 的 Customer_Id=3 进行了更改。 ![]() 使用 SET NULL 操作的外键示例在这里,我们将理解 SET NULL 操作如何与外键一起工作。首先,我们需要创建两个名为Persons和Contacts的表,如下所示 表:Persons 表:Customers 接下来,我们需要使用以下语句将数据插入两个表中 现在,更新“Persons”表中的 ID 最后,使用以下 SELECT 语句验证更新 ![]() 如果我们查看我们的表,我们可以看到两个表都已更改。由于 ON UPDATE SET NULL 操作,Contacts 表中 Person_Id=3 的行已自动设置为NULL。 如何删除外键MySQL 允许使用 ALTER TABLE 语句从表中删除现有外键。以下语法用于删除外键 这里,table_name是我们从中删除外键的表的名称。constraint_name是创建表时添加的外键的名称。 如果我们不知道表中现有外键的名称,请执行以下命令 它将产生如下输出,我们可以看到表 contact 有一个名为 fk_customer 的外键,显示在红色矩形中。 ![]() 现在,要从 contact 表中删除此外键约束,请执行以下语句 我们可以使用 SHOW CREATE TABLE 语句来验证外键约束是否已删除。它将产生如下输出,我们可以看到外键不再存在于 contact 表中。 ![]() 使用 ALTER TABLE 语句定义外键此语句允许我们对现有表进行修改。有时需要为现有表的列添加外键,然后使用此语句为该列添加外键。 语法 以下是使用 ALTER TABLE 语句将外键添加到现有表的语法 当使用 ALTER TABLE 语句添加外键时,建议首先在由外键引用的列上创建索引。 示例 以下语句创建两个表“Person”和“Contact”,而不在表定义中包含外键列。 表:Person 表:Contact 创建表后,如果想为现有表添加外键,则需要执行以下 ALTER TABLE 语句 外键检查MySQL 有一个特殊变量foreign_key_cheks来控制表中的外键检查。默认情况下,它已启用,以便在对表进行正常操作期间强制执行参照完整性。此变量是动态的,因此它同时支持全局和会话范围。 有时需要禁用外键检查,这在以下情况下非常有用
以下语句允许我们禁用外键检查 以下语句允许我们启用外键检查 下一主题MySQL 复合键 |
我们请求您订阅我们的新闻通讯以获取最新更新。