授课语音

MySQL 中的外键约束(FOREIGN KEY)与级联操作(ON DELETE CASCADEON 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 CASCADEON UPDATE CASCADE

级联操作是指在执行删除(DELETE)或更新(UPDATE)操作时,自动对与其相关联的外键进行操作。MySQL 提供了多种级联操作选项,其中最常用的是 ON DELETE CASCADEON 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 表中的某个客户时,所有该客户的订单记录会被级联删除。

代码说明:

  1. orders 表中的 customer_id 列是外键,引用了 customers 表中的 customer_id 列。
  2. 当父表 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 会被级联更新。

代码说明:

  1. orders 表中的 customer_id 列是外键,引用了 customers 表中的 customer_id 列。
  2. customers 表中的 customer_id 更新时,orders 表中的所有相关记录也会被更新。

3. 综合示例:外键约束与级联操作

假设有两个表:customersorders,我们希望建立 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_idorders 表中与该客户关联的订单的 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 CASCADEON UPDATE CASCADE)可以自动删除或更新与父表数据相关联的子表数据,简化了复杂的数据维护工作。
  • 使用外键和级联操作时,能够有效避免数据不一致性问题,提高数据管理的效率。

通过理解和使用外键约束与级联操作,可以确保数据库设计的规范性,并使得数据之间的关系得到更好的维护。

去1:1私密咨询

系列课程: