每当在表上触发删除事件时,都会自动调用MySQL中的AFTER DELETE触发器。在本文中无涯教程学习如何使用其语法和示例创建AFTER DELETE触发器。
语法
以下是在MySQL中创建 AFTER DELETE 触发器的语法:
CREATE TRIGGER trigger_name AFTER DELETE ON table_name FOR EACH ROW Trigger_body ;
AFTER DELETE触发器语法参数可以解释如下:
- 首先,将指定要创建的触发器的名称。它在架构中应该是唯一的。
- 第二,将指定触发动作时间,该时间应为"删除后"。在表的每一行更改发生后,将触发此触发器。
- 第三,将指定与触发器关联的表的名称。它必须写在ON关键字之后。如果不指定表名,则触发器将不存在。
- 最后,将指定触发主体,其中包含在触发触发器时执行的语句。
如果要执行多个语句,将使用 BEGIN END 块,该块包含一组SQL查询,以定义触发器的逻辑。请参见以下语法:
DELIMITER $$ CREATE TRIGGER trigger_name AFTER DELETE ON table_name FOR EACH ROW BEGIN variable declarations trigger code END$$ DELIMITER ;
限制条件
- 可以访问OLD行,但是无法在AFTER DELETE触发器中更新它们。
- 无法访问NEW行。这是因为不存在NEW行。
- 无法在VIEW上创建AFTER DELETE触发器。
删除后触发示例
让无涯教程通过示例了解如何使用MySQL中的CREATE TRIGGER语句创建AFTER DELETE触发器。
假设创建了一个名为薪金的表,用于存储员工的薪水信息,如下所示:
CREATE TABLE salaries (
emp_num INT PRIMARY KEY,
valid_from DATE NOT NULL,
amount DEC(8 , 2 ) NOT NULL DEFAULT 0
);
接下来,无涯教程将使用以下语句将一些记录插入该表:
INSERT INTO salaries (emp_num, valid_from, amount)
VALUES
(102, 2020-01-10, 45000),
(103, 2020-01-10, 65000),
(105, 2020-01-10, 55000),
(107, 2020-01-10, 70000),
(109, 2020-01-10, 40000);
执行SELECT查询以查看表数据。

第三,将创建另一个名为 total_salary_budget 的表,该表将保留薪水表中的薪水信息。
CREATE TABLE total_salary_budget(
total_budget DECIMAL(10,2) NOT NULL
);
第四,无涯教程将使用 SUM()函数,该函数从薪金表返回总薪水,并将此信息保留在total_salary_budget表中:
mysql> INSERT INTO total_salary_budget (total_budget) SELECT SUM(amount) FROM salaries;
执行SELECT语句以验证表:

然后,将创建一个AFTER DELETE触发器,在从工资表中删除一行后,将总工资更新到total_salary_budget表中。
DELIMITER $$CREATE TRIGGER after_delete_salaries AFTER DELETE ON salaries FOR EACH ROW BEGIN UPDATE total_salary_budget SET total_budget = total_budget - old.amount; END$$
DELIMITER ;

在此触发器中,无涯教程首先指定了触发器名称after_delete_salaries。然后,指定触发事件。第三,指定了与触发器关联的表名。最后,在触发器主体内编写了触发器逻辑,该逻辑在从工资表中删除一行后将总工资更新到total_salary_budget表中。
如何调用AFTER DELETE触发器?
首先,将使用以下语句从上面的触发器中删除工资表中的工资:
mysql> DELETE FROM salaries WHERE emp_num = 105;
接下来,将从total_salary_budget表中查询数据。无涯教程可以看到该表在执行查询后已被修改。请参见以下输出:
mysql> SELECT * FROM total_salary_budget;

在输出中,可以看到删除的薪水减少了total_budget。
第三,将从薪金表中删除所有数据:
mysql> DELETE FROM salaries;
同样,将从total_salary_budget表中查询数据。无涯教程可以看到,执行查询后,触发器将表更新为零。请参见以下输出: