MySQL中的外键约束(FOREIGN KEY)是一种引用完整性约束,用于确保两个表之间的数据一致性,即一个表(从表或子表)中的列(外键)的值必须存在于另一个表(主表或父表)的指定列(主键或其他唯一键)中。外键约束有助于维护数据库中的数据关系,特别是关联数据的一致性和准确性。以下是外键约束的几个关键点和使用方法:
1. 基本概念
- 主键(PRIMARY KEY):在父表中,它是用于唯一标识每一行记录的列或列组合。
- 外键(FOREIGN KEY):在从表中,它是一个或多个列,其值必须参照父表中相应列的值。
2. 创建外键
外键可以在创建表时定义,也可以在表创建后通过 ALTER TABLE
语句添加。
创建表时定义外键
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
CustomerID INT,
OrderDate DATE,
FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);
在这个例子中,Orders
表中的 CustomerID
列是外键,它引用了 Customers
表的 CustomerID
列。
添加外键到已存在的表
ALTER TABLE Orders
ADD FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID);
3. 外键约束选项
-
ON DELETE:定义当父表中的相关记录被删除时,从表中的对应记录应如何处理。常见选项有:
CASCADE
:从表中的相关记录也将被删除。SET NULL
:从表中的外键列值被设置为NULL(前提是外键列允许NULL)。SET DEFAULT
:将外键列值设置为其默认值(如果设定了默认值)。RESTRICT
:默认选项,如果从表中有匹配记录,则不允许删除父表记录。
-
ON UPDATE:定义当父表中的相关记录被更新时,从表中的对应记录应如何响应。选项与
ON DELETE
相似。
4. 删除外键
ALTER TABLE Orders
DROP FOREIGN KEY fk_orders_customers; -- fk_orders_customers 是外键约束的名称
如果不知道外键名称,可以通过 SHOW CREATE TABLE
命令查看表结构,从中找到外键名称。
5. 注意事项
- 在定义外键时,确保父表的引用列已经存在并且设置了适当的约束(如PRIMARY KEY或UNIQUE)。
- 外键列和参照列的数据类型必须兼容,长度和签名需一致。
- 在处理大量数据或复杂查询时,外键约束可能会影响性能,尤其是在频繁的插入、更新和删除操作中。
- 虽然外键可以提高数据的完整性,但在某些高性能应用场景中,可能选择不使用外键约束,而通过应用程序逻辑来维护数据间的一致性。
外键是关系型数据库中实现数据关联和数据一致性的强大工具,正确使用可以显著提升数据的准确性和可靠性。
外键在数据库设计中扮演着至关重要的角色,主要用于维持数据的一致性和完整性,以及表达实体间的关联关系。以下是外键的几个实际用途及例子:
1. 维持数据一致性与完整性
例子1:订单与客户
假设你正在设计一个电商系统的数据库,其中有两个表:一个是 orders
(订单表),一个是 customers
(客户表)。在 orders
表中,每个订单都关联到一个客户。为了确保每笔订单都指向一个真实存在的客户,你可以在 orders
表中创建一个外键,引用 customers
表的主键(通常是客户ID)。
-
主表(Parent Table):
customers
- 列:
customer_id
(主键),name
,email
,address
- 列:
-
从表(Child Table):
orders
- 列:
order_id
(主键),product
,quantity
,order_date
,customer_id
(外键)
- 列:
这样,如果试图插入一个订单记录,但使用的 customer_id
在 customers
表中不存在,数据库就会拒绝插入,从而保证了数据的完整性。
2. 实现级联操作
例子2:部门与员工
假设有 departments
(部门表)和 employees
(员工表)两个表。每个员工属于一个部门,employees
表中的 department_id
是外键,引用 departments
表的 department_id
。
-
主表(Parent Table):
departments
- 列:
department_id
(主键),department_name
- 列:
-
从表(Child Table):
employees
- 列:
employee_id
(主键),name
,position
,department_id
(外键)
- 列:
当使用 ON DELETE CASCADE
选项定义外键时,如果删除一个部门,那么属于该部门的所有员工记录也会自动删除,确保数据的一致性。
3. 支持复杂的查询和数据分析
例子3:课程与学生
在教育系统的数据库设计中,courses
(课程表)和 students
(学生表)通过一个关联表 course_enrollments
(课程报名表)相连,表示学生报名了哪些课程。course_enrollments
表中的 student_id
和 course_id
都是外键,分别引用 students
和 courses
表的主键。
-
主表(Parent Table):
students
:student_id
(主键),name
,major
courses
:course_id
(主键),course_name
,instructor
-
关联表(Join Table):
course_enrollments
- 列:
enrollment_id
(主键, 可选),student_id
(外键),course_id
(外键),enrollment_date
- 列:
有了这样的设计,你可以轻松查询每个学生的选课情况、每门课程的报名学生名单,或者分析特定专业学生对课程的偏好等,这在统计和报告生成中非常有用。
通过这些例子可以看出,外键不仅帮助维护了数据库中数据的一致性和完整性,还促进了高效的数据管理和分析,是构建复杂数据模型不可或缺的一部分。
外键并不必须是另一个表的主键,但外键所引用的列必须在另一个表中具有唯一性约束。这意味着外键可以引用另一个表的主键,也可以引用具有唯一约束的非主键列。关键在于被引用的列必须能够唯一标识那一行记录,以确保数据的引用完整性。
总结来说:
- 主键要求在一张表中唯一标识每一行记录,且不能为空。
- 外键则用来建立两个表之间的关联,它引用另一个表中的一个唯一标识(这通常是一个主键,但也可以是唯一索引的列),允许在从表中外键列的值为空或引用主表中某行的值。
因此,外键并不强制要求是目标表的主键,只要它是唯一即可。
在MySQL中,外键约束(FOREIGN KEY constraint)用于确保主表和从表之间的关系一致性。当创建外键约束时,可以指定 ON DELETE
和 ON UPDATE
动作,以定义当主表中的行被删除或更新时,从表中受影响的行应如何处理。
关于 ON DELETE
和 ON UPDATE
选项:
ON DELETE:
- CASCADE: 当主表中的行被删除时,从表中所有依赖于该行的行也将被自动删除。这可以防止孤儿记录的产生。
- SET NULL: 当主表中的行被删除时,从表中依赖于该行的外键字段将被设置为NULL(前提是从表的外键字段允许NULL值)。
- NO ACTION: 默认情况下,如果从表中有依赖的行,则不允许删除主表中的行。这可以防止意外删除导致的关系不一致。
- RESTRICT: 与
NO ACTION
相似,不允许删除主表中的行,如果从表中有依赖的行。这是NO ACTION
的同义词。 - SET DEFAULT: 将从表中的外键字段设置为其默认值。如果字段有定义默认值的话。
ON UPDATE:
- CASCADE: 当主表中的行被更新时,从表中所有依赖于该行的外键字段也将被更新为新的主键值。
- SET NULL: 当主表中的行被更新时,从表中依赖于该行的外键字段将被设置为NULL(如果字段允许NULL值)。
- NO ACTION: 不允许更新主表中的行,如果从表中有依赖于原主键值的行。
- RESTRICT: 同
NO ACTION
。 - SET DEFAULT: 将从表中的外键字段设置为其默认值。
创建外键约束示例:
假设我们有两个表 authors
和 books
,authors
表有 author_id
作为主键,books
表有 book_id
作为主键和 author_id
作为外键。
CREATE TABLE authors (
author_id INT PRIMARY KEY,
author_name VARCHAR(100)
);
CREATE TABLE books (
book_id INT PRIMARY KEY,
title VARCHAR(100),
author_id INT,
FOREIGN KEY (author_id) REFERENCES authors(author_id)
ON DELETE CASCADE -- 当删除authors表中的行时,也删除books表中相应的行
ON UPDATE CASCADE -- 当更新authors表中的author_id时,也更新books表中的author_id
);
在这个例子中,如果 authors
表中的某行被删除,那么 books
表中所有引用该作者ID的行也将被删除,以保持数据一致性。同样,如果 authors
表中的 author_id
被更新,那么 books
表中相应的 author_id
也会被更新。
使用 ON DELETE
和 ON UPDATE
选项时,应根据具体业务逻辑和数据完整性需求来选择合适的动作。
第5章 多表操作.pptx
https://www.alipan.com/s/MTAK5u3RqyY
提取码: 588l
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。