MySql教程
MySql用户管理
MySQL数据库
MySql表格和视图
MySQL查询
MySQL索引
MySQL子句
MySQL授权
MySql控制流
MySQL条件
MySQL连接
MySQL键
MySQL触发器
MySQL聚合函数
MySQL常用
MySQL正则表达式
MySql差异性

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查询,以将数据验证到表中,如下所示:
MySQL ON DELETE CASCADE
表格: 付款
下面的语句创建一个付款表:
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查询以将数据验证到表中,如下所示:
 MySQL ON DELETE CASCADE
让我们从父表Employee中 删除数据。为此,请执行以下语句:
mysql> DELETE FROM Employee WHERE emp_id = 102;
上面的语句会将其 emp_id = 102 引用数据的员工记录删除到子表中。我们可以使用SELECT语句验证数据,该语句将提供以下输出:
MySQL ON DELETE CASCADE
在上面的输出中,我们看到引用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 ON DELETE 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;
它将给出以下输出:
MySQL ON DELETE CASCADE
在下面的脚本,我们将更新父表中的员工ID,它也会自动在子表中反映此更改:
mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103;
验证Employee and Payment表的内容,我们将看到 emp_id 列值将成功更新。
MySQL ON DELETE CASCADE
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4