MySQL ON DELETE CASCADE
MySQL中的ON DELETE CASCADE子句用于在我们删除子表中的行时自动
删除子表中的匹配记录父表。这是与
外键相关的一种引用操作。
假设我们创建了两个带有外键关系的FOREIGN KEY的表,使这两个表成为父子关系。接下来,我们为一个FOREIGN KEY定义一个ON DELETE CASCADE子句,必须将另一个FOREIGN KEY设置为成功进行级联操作。如果仅为一个FOREIGN KEY子句定义ON DELETE CASCADE,则级联操作将引发错误。
MySQL ON DELETE CASCADE示例
让我们了解如何我们可以在MySQL表中使用ON DELETE CASCADE子句。首先,我们将创建两个名为
Employee和Payment 的表。这两个表都是通过外键与on delete级联操作关联的。在这里,雇员是
父表,付款是
子表。以下脚本创建两个表及其记录。
表: Employee
以下语句创建表Employee:
CREATE TABLE Employee (
emp_id int(10) NOT null,
name varchar(40) NOT null,
birthdate date NOT null,
gender varchar(10) NOT null,
hire_date date NOT null,
PRIMARY KEY (emp_id)
);
接下来,执行插入查询以填充记录。
INSERT INTO Employee (emp_id, name, birthdate, gender, hire_date) VALUES
(101, 'Bryan', '1988-08-12', 'M', '2015-08-26'),
(102, 'Joseph', '1978-05-12', 'M', '2014-10-21'),
(103, 'Mike', '1984-10-13', 'M', '2017-10-28'),
(104, 'Daren', '1979-04-11', 'M', '2006-11-01'),
(105, 'Marie', '1990-02-11', 'F', '2018-10-12');
执行 SELECT查询,以将数据验证到表中,如下所示:
表格: 付款
下面的语句创建一个付款表:
CREATE TABLE Payment (
payment_id int(10) PRIMARY KEY NOT null,
emp_id int(10) NOT null,
amount float NOT null,
payment_date date NOT null,
FOREIGN KEY (emp_id) REFERENCES Employee (emp_id) ON DELETE CASCADE
);
接下来,执行插入语句,将记录填充到表中。
INSERT INTO Payment (payment_id, emp_id, amount, payment_date) VALUES
(301, 101, 1200, '2015-09-15'),
(302, 101, 1200, '2015-09-30'),
(303, 101, 1500, '2015-10-15'),
(304, 101, 1500, '2015-10-30'),
(305, 102, 1800, '2015-09-15'),
(306, 102, 1800, '2015-09-30');
执行SELECT查询以将数据验证到表中,如下所示:
让我们从父表Employee中
删除数据。为此,请执行以下语句:
mysql> DELETE FROM Employee WHERE emp_id = 102;
上面的语句会将其
emp_id = 102 和
引用数据的员工记录删除到子表中。我们可以使用SELECT语句验证数据,该语句将提供以下输出:
在上面的输出中,我们看到引用emp_id = 102的所有行均已从两个表中自动删除。
如何通过ON DELETE CASCADE查找受影响的表
有时候,在从表中删除记录之前,我们想通过ON DELETE CASCADE引用操作来了解受影响的表。我们可以通过在information_schema数据库中的referential_constraints中进行查询来找到此信息,如下所示:
USE information_schema;
SELECT table_name FROM referential_constraints
WHERE constraint_schema = 'database_name'
AND referenced_table_name = 'parent_table'
AND delete_rule = 'CASCADE'
以下语句使用
employeedb 数据库中的ON DELETE CASCADE规则生成与Employee表关联的表的结果:
USE information_schema;
SELECT table_name FROM referential_constraints
WHERE constraint_schema = 'employeedb'
AND referenced_table_name = 'Employee'
AND delete_rule = 'CASCADE';
执行上述命令后,我们将获得以下输出:
MySQL 中的MySQL ON UPDATE CASCADE子句
ON UPDATE CASCADE子句>用于在我们更新父表中的行时自动
更新子表中的匹配记录。以下示例对其进行了更清晰的说明。
首先,我们需要使用
ALTER TABLE 语句在"付款"表中添加ON UPDATE CASCADE子句,如下所示:
ALTER TABLE Payment ADD CONSTRAint `payment_fk`
FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE;
它将给出以下输出:
在下面的脚本,我们将更新父表中的员工ID,它也会自动在子表中反映此更改:
mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103;
验证Employee and Payment表的内容,我们将看到
emp_id 列值将成功更新。