MySQL BEFORE DELETE触发器
每当对表触发删除操作时,就会自动调用 MySQL 中的 BEFORE DELETE 触发器。在本文中,我们将学习如何创建BEFORE DELETE触发器及其语法和示例。
一、MySQL 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 触发器中更新它们。
- 我们无法访问新行。这是因为没有新行存在。
- 我们不能在 VIEW 上创建 BEFORE DELETE 触发器。
二、MySQL BEFORE DELETE触发器 示例
让我们通过一个示例来了解如何使用MySQL 中的 CREATE TRIGGER 语句创建 BEFORE DELETE 触发器。
假设我们创建了一个名为salary的表来存储员工的工资信息,如下所示:
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 触发器,该触发器在从薪金表中删除一行之前将新记录插入到薪金档案表中。
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 触发器以及如何调用它们。因此,首先,我们将从薪水表中删除一行:
mysql> DELETE FROM salaries WHERE emp_num = 105;
其次,我们将从salary_archives表中查询数据,通过select语句验证上面创建的触发器是否被调用:
mysql> SELECT * FROM salary_archives;
执行完一条语句,我们可以看到触发器被成功调用,并在salary_archives表中插入了一条新记录。
第三,我们将从薪水表中删除所有行:
mysql> DELETE FROM salaries;
最后,我们将再次从salary_archives 表中查询数据。触发器被调用了四次,因为 DELETE 语句从薪金表中删除了四条记录。请参阅以下输出:
四、如何在 MySQL Workbench中创建 BEFORE DELETE 触发器?
要使用MySQL Workbench创建 BEFORE DELETE 触发器,我们首先需要启动它,然后使用我们之前创建的用户名和密码登录。我们将得到如下画面:
现在执行以下步骤来创建 BEFORE DELETE 触发器:
1. 转到 Navigation 选项卡并单击包含MySQL服务器中所有可用数据库的Schema 菜单。
2. 选择数据库(例如employeedb),双击它。它将显示包含表、视图、函数和存储过程的子菜单。请参阅下面的屏幕。
3. 展开表子菜单并选择要在其上创建触发器的表。选择表后,右键单击所选表(例如,薪水),然后单击Alter Table选项。见下图:
4. 点击 Alter Table 选项,屏幕如下:
5. 现在,单击上一部分红色矩形框中显示的触发选项卡,然后选择删除前的时序/事件。我们会注意到有一个 (+) 图标按钮来添加触发器。单击该按钮,我们将根据选择时间/事件获得触发的默认代码:
6. 现在,完成触发器代码,再次检查它们,如果没有发现错误,单击应用按钮。
7.点击Apply按钮后,点击Finish按钮完成。
8. 如果我们在模式菜单中查看,我们将在salaries下看到触发器薪水_before_trigger,如下所示:
热门文章
优秀文章