第5课_外键与级联操作
热度🔥:80 免费课程
授课语音
MySQL 中的外键约束(FOREIGN KEY
)与级联操作(ON DELETE CASCADE
、ON UPDATE CASCADE
)
在关系型数据库中,外键约束(FOREIGN KEY
)用于确保数据的完整性,它是指一个表中的某一列(或几列)引用了另一个表的主键或唯一键。外键约束不仅用于建立表之间的关系,还能够保证数据的一致性和完整性。级联操作则是在外键约束下,定义删除或更新操作时的行为。
1. 外键约束(FOREIGN KEY
)
外键是指一个表中的字段指向另一个表的主键或唯一键。外键约束用于保持表与表之间的引用完整性,确保在一个表中引用的值必须在另一个表中存在。
1.1 外键的基本语法
CREATE TABLE `child_table` (
`id` INT PRIMARY KEY,
`parent_id` INT,
FOREIGN KEY (`parent_id`) REFERENCES `parent_table`(`id`)
);
child_table
:子表,包含外键列。parent_table
:父表,外键指向的表。parent_id
:子表中的外键列,引用父表的主键(或唯一键)。id
:父表的主键列。
1.2 外键约束的作用
- 数据完整性:确保外键列中引用的数据必须在父表中存在。
- 防止无效引用:如果在子表中插入不在父表中存在的值,MySQL 会阻止操作。
- 维护数据关系:外键约束使得父表和子表之间的数据关系更加明确。
2. 级联操作(ON DELETE CASCADE
、ON UPDATE CASCADE
)
级联操作是指在执行删除(DELETE
)或更新(UPDATE
)操作时,自动对与其相关联的外键进行操作。MySQL 提供了多种级联操作选项,其中最常用的是 ON DELETE CASCADE
和 ON UPDATE CASCADE
。
2.1 ON DELETE CASCADE
- 用途:当父表中的数据被删除时,自动删除与之关联的子表中的数据。
- 应用场景:当父表中的一条记录不再需要时,自动清理子表中与之相关的数据。
2.2 ON DELETE CASCADE
示例
CREATE TABLE `orders` (
`order_id` INT PRIMARY KEY,
`customer_id` INT,
FOREIGN KEY (`customer_id`) REFERENCES `customers`(`customer_id`) ON DELETE CASCADE
);
- 操作:如果
customers
表中的一条记录被删除,与其关联的orders
表中的记录也会被自动删除。 - 说明:当删除
customers
表中的某个客户时,所有该客户的订单记录会被级联删除。
代码说明:
orders
表中的customer_id
列是外键,引用了customers
表中的customer_id
列。- 当父表
customers
中某个customer_id
被删除时,orders
表中所有与该customer_id
关联的记录会被自动删除。
2.3 ON UPDATE CASCADE
- 用途:当父表中的数据被更新时,自动更新子表中与之关联的外键值。
- 应用场景:当父表的主键或唯一键值发生更改时,自动同步更新子表中的外键值。
2.4 ON UPDATE CASCADE
示例
CREATE TABLE `orders` (
`order_id` INT PRIMARY KEY,
`customer_id` INT,
FOREIGN KEY (`customer_id`) REFERENCES `customers`(`customer_id`) ON UPDATE CASCADE
);
- 操作:如果
customers
表中的customer_id
被更新,orders
表中所有与之关联的记录的customer_id
也会被更新。 - 说明:当更新
customers
表中的某个客户的customer_id
时,orders
表中所有该客户的订单记录中的customer_id
会被级联更新。
代码说明:
orders
表中的customer_id
列是外键,引用了customers
表中的customer_id
列。- 当
customers
表中的customer_id
更新时,orders
表中的所有相关记录也会被更新。
3. 综合示例:外键约束与级联操作
假设有两个表:customers
和 orders
,我们希望建立 customers
表和 orders
表之间的关联,并且在 customers
表的数据发生删除或更新时,自动级联操作。
3.1 创建表并使用外键约束与级联操作
-- 创建 customers 表
CREATE TABLE `customers` (
`customer_id` INT AUTO_INCREMENT PRIMARY KEY,
`name` VARCHAR(100)
);
-- 创建 orders 表
CREATE TABLE `orders` (
`order_id` INT AUTO_INCREMENT PRIMARY KEY,
`order_date` DATE,
`customer_id` INT,
FOREIGN KEY (`customer_id`)
REFERENCES `customers`(`customer_id`)
ON DELETE CASCADE
ON UPDATE CASCADE
);
- 操作:
- 在
customers
表中插入客户数据。 - 在
orders
表中插入与客户相关的订单数据。 - 如果删除
customers
表中的某个客户,orders
表中与该客户关联的订单会被自动删除。 - 如果更新
customers
表中的customer_id
,orders
表中与该客户关联的订单的customer_id
会被自动更新。
- 在
3.2 插入示例数据
-- 插入数据到 customers 表
INSERT INTO `customers` (`name`) VALUES ('John Doe');
INSERT INTO `customers` (`name`) VALUES ('Jane Smith');
-- 插入数据到 orders 表
INSERT INTO `orders` (`order_date`, `customer_id`) VALUES ('2024-12-01', 1);
INSERT INTO `orders` (`order_date`, `customer_id`) VALUES ('2024-12-02', 2);
3.3 删除操作
-- 删除 customer_id 为 1 的客户
DELETE FROM `customers` WHERE `customer_id` = 1;
-- 结果:orders 表中 customer_id 为 1 的订单将被删除
3.4 更新操作
-- 更新 customer_id 为 2 的客户
UPDATE `customers` SET `customer_id` = 3 WHERE `customer_id` = 2;
-- 结果:orders 表中 customer_id 为 2 的订单会被更新为 3
4. 总结
- 外键约束(
FOREIGN KEY
)是用于建立表与表之间关系的重要工具,能够确保数据的一致性和完整性。 - 级联操作(
ON DELETE CASCADE
和ON UPDATE CASCADE
)可以自动删除或更新与父表数据相关联的子表数据,简化了复杂的数据维护工作。 - 使用外键和级联操作时,能够有效避免数据不一致性问题,提高数据管理的效率。
通过理解和使用外键约束与级联操作,可以确保数据库设计的规范性,并使得数据之间的关系得到更好的维护。