MySQL BEFORE DELETE 触发器
在MySQL中,BEFORE DELETE触发器会在对表进行删除操作时自动调用。本文将介绍如何使用语法和示例创建一个before delete触发器。
语法
以下是在MySQL中创建BEFORE DELETE触发器的语法:
CREATE TRIGGER trigger_name
BEFORE DELETE
ON table_name FOR EACH ROW
Trigger_body ;
BEFORE DELETE触发器的语法参数可以解释如下:
- 首先,我们将指定要创建的触发器的名称。它应该在架构中是唯一的。
- 其次,我们将指定触发器的操作时间,应设为BEFORE DELETE。此触发器将在表上的每一行变更发生之前调用。
- 第三,我们将指定与触发器关联的表的名称。它必须写在ON关键字之后。如果我们没有指定表名,触发器将不存在。
- 最后,我们将指定在触发器被激活时执行的语句。
如果我们想执行多个语句,我们将使用包含一组查询的BEGIN END块来定义触发器的逻辑。请参阅下面的语法:
DELIMITER CREATE TRIGGER trigger_name BEFORE DELETE
ON table_name FOR EACH ROW
BEGIN
variable declarations
trigger code
END
DELIMITER ;
限制条件
- 我们可以在BEFORE DELETE触发器中访问旧行,但无法更新它们。
- 我们无法访问新行,因为没有新行存在。
- 我们无法在视图上创建BEFORE DELETE触发器。
BEFORE DELETE触发器示例
让我们通过使用MySQL中的CREATE TRIGGER语句及一个例子来理解如何创建BEFORE DELETE触发器。
假设我们已经创建了一个名为salaries的表来存储雇员的薪水信息,如下所示:
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查询以查看表数据。
第三,我们将创建另一个名为salary_archives的表,它保存了已删除薪资的信息。
CREATE TABLE salary_archives (
id INT PRIMARY KEY AUTO_INCREMENT,
emp_num INT,
valid_from DATE NOT NULL,
amount DEC(18 , 2 ) NOT NULL DEFAULT 0,
deleted_time TIMESTAMP DEFAULT NOW()
);
然后,我们将创建一个BEFORE DELETE触发器,在从薪水表删除行之前将一条新记录插入到salary_archives表中。
DELIMITER CREATE TRIGGER before_delete_salaries
BEFORE DELETE
ON salaries FOR EACH ROW
BEGIN
INSERT INTO salary_archives (emp_num, valid_from, amount)
VALUES(OLD. emp_num, OLD.valid_from, OLD.amount);
END
DELIMITER ;
在这个触发器中,我们首先指定了触发器名称before_delete_salaries。接下来,我们指定了触发事件。第三,我们指定了与触发器关联的表名。最后,我们在触发器体内编写了触发逻辑,将被删除的行插入到salary_archives表中。
如何调用BEFORE DELETE触发器?
让我们测试上述创建的BEFORE DELETE触发器以及如何调用它们。首先,我们将从salaries表中删除一行:
mysql> DELETE FROM salaries WHERE emp_num = 105;
其次,我们将使用select语句从salary_archives表中查询数据,以验证上述创建的触发器是否被调用:
mysql> SELECT * FROM salary_archives;
执行完一条语句后,我们可以看到触发器成功调用并向salary_archives表中插入了一条新记录。
其次,我们将从薪资表中删除所有的行:
mysql> DELETE FROM salaries;
最后,我们会再次从salary_archives表中查询数据。触发器被调用了四次,因为DELETE语句从salaries表中删除了四条记录。请看下面的输出:
如何在MySQL workbench中创建BEFORE DELETE触发器?
要使用MySQL workbench创建BEFORE DELETE触发器,我们首先需要启动它,然后使用之前创建的用户名和密码登录。我们将获得以下屏幕:
现在按照以下步骤创建”BEFORE DELETE”触发器:
1. 转到导航选项卡,并点击包含所有可用数据库的”Schema”菜单。
2. 选择数据库(例如,employeedb),双击它。它将显示包含表、视图、函数和存储过程的子菜单。请参见下面的屏幕。
3. 展开 表子菜单 并选择要创建触发器的表格。 触发器 . 选择一个表格后,右键点击已选中的表格(例如,薪水),然后点击 修改表 选项。参见下方图片:
4. 单击 “修改表” 选项,将显示如下屏幕:
5. 现在,点击上一节红色矩形框内显示的 触发器选项卡 ,然后选择”删除之前的时间/事件(BEFORE DELETE)”。我们会注意到有一个(+)图标按钮用于添加触发器。点击该按钮,我们将会得到一个基于选择的时间/事件的默认触发器代码:
6. 现在,完成触发器代码,再次查看一遍,如果没有发现错误,请点击 Apply 按钮。
7. 点击应用按钮后,点击 完成 按钮以完成。
8. 如果我们查看模式菜单,我们将看到触发器 salaries_before_trigger 在工资表下方如下所示: