MySQL 主键和外键的区别
MySQL中的键是构建两个表之间关系的基本要素。它们对于维护关系数据库结构非常有用。 它们之间的主要区别是主键用于标识表中的每条记录,而外键用于将两个表链接在一起 。在本文中,我们将根据各种参数讨论主键和外键之间的基本区别。在进行比较之前,我们将简要讨论这些键。
什么是主键?
主键是一种在表或关系中唯一标识每条记录的键。每个数据库需要为表中的每一行设置一个唯一标识符,而主键在唯一地标识表中的行方面起着重要作用。主键列不能存储重复值。它也被称为最小超键,因此在任何关系中我们不能指定多个主键。
例如 ,我们有一个名为 customer 的表,其属性包括ID、Name和City。只有ID列可以永远不包含重复和NULL值,因为每个顾客都有唯一的标识号。这个特性有助于唯一地标识数据库中的每条记录。因此,我们可以将ID属性设置为主键。
什么是外键?
外键是数据库中一组列,用于唯一标识另一个表中的另一条数据库记录,以维护引用完整性。它也被称为建立了两个不同表之间关系的引用键。外键始终与另一个表中的主键列匹配。这意味着一个表中的外键列引用了另一个表中的主键列。外键在关系型数据库规范化中非常有用,特别是当我们需要访问其他表中的记录时。
外键在父子表之间创建了一个父子关系,父表保存初始列值,而子表引用父表的列值。只有在子表上找到外键约束时,我们才能实现这种关系。
例如,我们有一个名为contact的表,其中包含ID、Customer_Id、Customer_Info和Type等属性。在这里,我们可以将Customer_Id列作为外键。
如果我们想要删除关系数据,从而从两个表中删除记录,我们可以在联系人表中定义外键,如下所示:
FOREIGN KEY (Customer_Id) REFERENCES customer(ID)
ON DELETE CASCADE
ON UPDATE CASCADE
当我们从客户表中删除任何记录时,联系表中的相关行也将被删除,并且两个表会自动更新。
主键和外键之间的主要区别
以下几点解释了主键和外键之间的区别:
- 在关系数据库中,主键约束作为表中每一行的唯一标识符。相反,外键约束建立了两个不同表之间的关系,以唯一标识同一表或其他表的一行。
- 主键列不存储NULL值,而外键可以接受多个NULL值。
- 关系数据库中的每个表都不能定义多个主键,而可以在一个表中指定多个外键。
- 我们不能删除父表中与子表的外键列引用的主键值。相反,我们可以删除子表的外键值,即使它们引用了父表的主键。
- 主键是唯一且非空的约束,因此不能有两行具有相同的主键属性值,而外键字段可以存储重复值。
- 我们可以无限制地向主键列中插入值。相反,在向外键表插入值时,我们需要确保该值存在于主键列中。
- 我们可以隐式地在临时表上定义主键约束,但不能在临时表上强制执行外键约束。
主键 vs 外键比较表格
以下比较表格以简洁的方式解释了它们的主要区别:
对比依据 | 主键 | 外键 |
---|---|---|
基本定义 | 用于唯一标识数据库表中的每条记录。 | 用于将两个表链接在一起。外键在一个表中指向另一个表的主键。 |
空值(NULL) | 主键列的值永远不能为NULL。 | 外键列可以接受NULL值。 |
计数 | 一张表只能有一个主键。 | 一张表可以有多个外键。 |
重复 | 主键是唯一属性,因此在关系中不能存储重复的值。 | 外键列可以存储重复的值。 |
索引 | 主键默认是一个聚集索引,这意味着它会自动创建索引。 | 外键默认不是聚集索引。我们可以手动创建聚集索引。 |
删除 | 无法从表中删除主键值。如果要删除它,请确保引用的外键不包含其值。 | 可以从表中删除外键值,无需担心它是否引用了另一个表的主键。 |
插入 | 可以将值插入主键列,无论其是否存在于外键中。 | 不能将不在主键列中的值插入到引用的外键列中。 |
临时表 | 可以在临时表上定义主键约束。 | 不能在临时表上定义外键约束。 |
关系 | 无法在表中创建父子关系。 | 可以在表中创建父子关系。 |
结论
在本文中,我们对主键和外键约束进行了比较。我们得出的结论是,这两个键在关系数据库模式中起着重要的作用,它们建立了多个表之间的关系。主键列始终存储表中每个记录的唯一值,而外键值可以重复。约束结构相同,但它们的功能不同,主键用于唯一标识表或关系中的记录,而外键用于链接两个表。