主键与外键的区别

17 Mar 2025 | 5 分钟阅读

MySQL 中的键是构建两个表之间关系的基本元素。它们对于维护关系数据库结构非常有用。它们的主要区别在于,主键用于唯一标识表中的每条记录,而外键用于将两个表连接起来。在本文中,我们将根据各种参数介绍主键和外键之间的主要区别。在进行比较之前,我们将简要讨论这些键。

Primary Key vs Foreign Key

什么是主键?

主键唯一或非空键,它在表或关系中唯一标识每条记录。每个数据库都需要为表的每一行提供一个唯一标识符,主键在唯一标识表中的行方面起着至关重要的作用。主键列不能存储重复值。它也被称为最小超键;因此,我们不能在任何关系中指定多个主键。

例如,我们有一个名为 customer 的表,其属性包括 ID、Name 和 City。只有 ID 列绝不能包含重复和 NULL 值,因为每个客户都有一个唯一的识别号。此功能有助于唯一标识数据库中的每条记录。因此,我们可以将 ID 属性设置为主键。

Primary Key vs Foreign Key

什么是外键?

外键是数据库中一个或多个列的集合,用于唯一标识其他表中的另一个数据库记录,以维护引用完整性。它也被称为引用键,用于在数据库中建立两个不同表之间的关系。外键始终与另一个表中的主键列匹配。这意味着一个表中的外键列引用另一个表的主键列。外键在关系数据库规范化中非常有用,尤其是当我们需要访问其他表中的记录时。

外键与表创建父子关系,其中父表保存初始列值,子表引用父列值。只有当在外键约束位于子表上时,我们才能实现这种关系。

例如,我们有一个名为 contact 的表,其属性包括 ID、Customer_Id、Customer_Info 和 Type。在这里,我们可以将 Customer_Id 列设置​​为外键。

Primary Key vs Foreign Key

如果我们要删除从两个表中删除记录的引用数据,我们可以按如下方式在 contact 表中定义外键:

当我们从 customer 表中删除任何记录时,contact 表中的相关行也将被删除,并且两个表都会自动更新。

主键与外键的主要区别

以下几点解释了主键和外键之间的区别

  • 关系数据库中的主键约束充当表中每一行的唯一标识符。相反,外键约束在两个不同的表之间建立关系,以唯一标识同一表或另一个表中的行。
  • 主键列不存储 NULL 值,而外键可以接受多个 NULL 值。
  • 关系数据库中的每个表不能定义多个主键,而我们可以在一个表中指定多个外键。
  • 我们不能删除父表的主键值,该值在子表中使用外键列引用。相反,我们可以删除子表的外键值,即使它们引用父表的主键。
  • 主键是唯一且非空的约束,因此没有两行可以具有相同的主键属性值,而外键字段可以存储重复值。
  • 我们可以无限制地将值插入主键列。相反,在将值插入外键表时,我们需要确保该值存在于主键列中。
  • 我们可以隐式地在临时表上定义主键约束,而不能在临时表上强制执行外键约束。

主键与外键比较图

以下比较图快速解释了它们的主要区别

比较基础主键外键
基本功能它用于唯一标识数据库表中的每条记录。它用于将两个表连接起来。这意味着一个表中的外键引用另一个表的主键。
NULL主键列值不能为 NULL。外键列可以接受 NULL 值。
数量一个表只能有一个主键。一个表可以有多个外键。
重复 (Duplication)主键是唯一属性;因此,它不能在关系中存储重复值。我们可以在外键列中存储重复值。
索引主键默认是聚集索引,这意味着它会自动索引。外键默认不是聚集索引。我们可以手动创建聚集索引。
删除主键值不能从表中删除。如果需要删除,请确保引用外键不包含其值。外键值可以从表中删除,而无需考虑它是否引用另一个表的主键。
插入我们可以无限制地将值插入主键列,无论它是否存在于外键中。主键列中不存在的值不能插入到引用外键中。
临时表主键约束可以在临时表上定义。外键约束不能在临时表上定义。
关系它不能在表中创建父子关系。它可以在表中创建父子关系。

结论

在本文中,我们比较了主键和外键约束。我们得出结论,这两个键在关系数据库模式中都扮演着重要的角色,因为它们在多个表之间建立关系。主键列始终为表中的每条记录存储唯一值,而外键值可以重复。两个约束结构相同,但它们的功能不同,因为主键唯一标识表或关系中的记录。而外键将两个表连接起来。