MySQL BEFORE DELETE 触发器

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查询以查看表数据。

MySQL BEFORE DELETE 触发器

第三,我们将创建另一个名为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 ;

MySQL BEFORE DELETE 触发器

在这个触发器中,我们首先指定了触发器名称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 BEFORE DELETE 触发器

其次,我们将从薪资表中删除所有的行:

mysql> DELETE FROM salaries;

最后,我们会再次从salary_archives表中查询数据。触发器被调用了四次,因为DELETE语句从salaries表中删除了四条记录。请看下面的输出:

MySQL BEFORE DELETE 触发器

如何在MySQL workbench中创建BEFORE DELETE触发器?

要使用MySQL workbench创建BEFORE DELETE触发器,我们首先需要启动它,然后使用之前创建的用户名和密码登录。我们将获得以下屏幕:

MySQL BEFORE DELETE 触发器

现在按照以下步骤创建”BEFORE DELETE”触发器:

1. 转到导航选项卡,并点击包含所有可用数据库的”Schema”菜单。

2. 选择数据库(例如,employeedb),双击它。它将显示包含表、视图、函数和存储过程的子菜单。请参见下面的屏幕。

MySQL BEFORE DELETE 触发器

3. 展开 表子菜单 并选择要创建触发器的表格。 触发器 . 选择一个表格后,右键点击已选中的表格(例如,薪水),然后点击 修改表 选项。参见下方图片:

MySQL BEFORE DELETE 触发器

4. 单击 “修改表” 选项,将显示如下屏幕:

MySQL BEFORE DELETE 触发器

5. 现在,点击上一节红色矩形框内显示的 触发器选项卡 ,然后选择”删除之前的时间/事件(BEFORE DELETE)”。我们会注意到有一个(+)图标按钮用于添加触发器。点击该按钮,我们将会得到一个基于选择的时间/事件的默认触发器代码:

MySQL BEFORE DELETE 触发器

6. 现在,完成触发器代码,再次查看一遍,如果没有发现错误,请点击 Apply 按钮。

MySQL BEFORE DELETE 触发器

7. 点击应用按钮后,点击 完成 按钮以完成。

MySQL BEFORE DELETE 触发器

8. 如果我们查看模式菜单,我们将看到触发器 salaries_before_trigger 在工资表下方如下所示:

MySQL BEFORE DELETE 触发器

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程