MySQL ON DELETE CASCADE
总结:在本教程中,您将学习如何使用 MySQL ON DELETE CASCADE 的外键引用操作从多个相关表中删除数据。
在上一教程中,您学习了如何使用单个 DELETE 语句从多个相关表中删除数据。但是,MySQL 提供了一种更有效的方法,称为外键 ON DELETE CASCADE 引用操作,它允许您在从父表中删除数据时自动从子表中删除数据。
MySQL ON DELETE CASCADE 实例
我们来看一个使用 MySQL 的例子 ON DELETE CASCADE 。
假设我们有两个表: buildings 和 rooms 。在这个数据库模型中,每栋建筑都有一个或多个房间。然而,每个房间只属于一栋楼。没有建筑就没有房间。
buildings 和 rooms 表之间的关系是一对多 (1:N) 的关系,如下面的数据库图所示:

当您从 buildings 表中删除一行时,您还想删除 rooms 表中所有引用表中行的行 buildings 。例如,当您删除建筑物编号的行时。2 buildings 表中查询如下:
DELETE FROM buildings
WHERE building_no = 2;
您还希望 rooms 表中引用建筑物编号 2 的行也将被删除。
以下是演示 ON DELETE CASCADE 引用操作如何工作的步骤。
第 1 步。创建 buildings 表:
CREATE TABLE buildings (
building_no INT PRIMARY KEY AUTO_INCREMENT,
building_name VARCHAR(255) NOT NULL,
address VARCHAR(255) NOT NULL
);
第 2 步。创建 rooms 表:
CREATE TABLE rooms (
room_no INT PRIMARY KEY AUTO_INCREMENT,
room_name VARCHAR(255) NOT NULL,
building_no INT NOT NULL,
FOREIGN KEY (building_no)
REFERENCES buildings (building_no)
ON DELETE CASCADE
);
请注意外键约束定义 ON DELETE CASCADE 末尾的子句。
第 3 步。在表中插入行 buildings :
INSERT INTO buildings(building_name,address)
VALUES('ACME Headquaters','3950 North 1st Street CA 95134'),
('ACME Sales','5000 North 1st Street CA 95134');
第 4 步。从 buildings 表中查询数据:
SELECT * FROM buildings;

我们在 buildings 表中有两行。
第 5 步。在表中插入行 rooms :
INSERT INTO rooms(room_name,building_no)
VALUES('Amazon',1),
('War Room',1),
('Office of CEO',1),
('Marketing',2),
('Showroom',2);
第 6 步。从 rooms 表中查询数据:
SELECT * FROM rooms;

我们有三个房间属于 1 号楼,两个房间属于 2 号楼。
第 7 步。删除建筑物编号的建筑物。2:
DELETE FROM buildings
WHERE building_no = 2;
第 8 步。从 rooms 表中查询数据:
SELECT * FROM rooms;

如您所见,所有引用 building_no 2的行都 被自动删除。
请注意,它 ON DELETE CASCADE 仅适用于具有支持外键的存储引擎的表, 例如 InnoDB。
某些表类型不支持 MyISAM 等外键,因此您应该为计划使用 MySQL ON DELETE CASCADE 引用操作的表选择合适的存储引擎。
查找受 MySQL ON DELETE CASCADE 操作影响的表的提示
有时, ON DELETE CASCADE 当您从表中删除数据时,了解哪个表受到引用操作的影响是很有用的。您可以从查询数据 referential_constraints 的 information_schema 数据库,如下所示:
USE information_schema;
SELECT
table_name
FROM
referential_constraints
WHERE
constraint_schema = 'database_name'
AND referenced_table_name = 'parent_table'
AND delete_rule = 'CASCADE'
例如,要查找与数据库 buildings 中具有 CASCADE 删除规则的表相关联的表 classicmodels ,请使用以下查询:
USE information_schema;
SELECT
table_name
FROM
referential_constraints
WHERE
constraint_schema = 'classicmodels'
AND referenced_table_name = 'buildings'
AND delete_rule = 'CASCADE'

在本教程中,您学习了如何在 ON DELETE CASCADE 从父表中删除数据时,使用外键的 MySQL引用操作自动从子表中删除数据。