MySQL BEFORE UPDATE触发器

MySQL BEFORE UPDATE触发器

在MySQL中,BEFORE UPDATE触发器会在与触发器关联的表上发生更新操作时自动调用。在本文中,我们将学习如何使用其语法和示例创建一个before update触发器。

语法

下面是在MySQL中创建BEFORE UPDATE触发器的语法:

CREATE TRIGGER trigger_name 
BEFORE UPDATE
ON table_name FOR EACH ROW
trigger_body ;

BEFORE UPDATE触发器的语法参数如下所示:

  • 首先,我们将指定要创建的触发器名称。它在模式中应该是唯一的。
  • 其次,我们将指定触发器的动作时间,应为BEFORE UPDATE。这个触发器将在每次对表进行修改之前被调用。
  • 第三,我们将指定触发器关联的表的名称。它必须写在ON关键词之后。如果我们没有指定表名,触发器将不会存在。
  • 最后,我们将指定包含在触发器激活时要执行的语句的触发器体。

如果我们想要执行多个语句,可以使用包含一组查询以定义触发器逻辑的BEGIN END块。请参见下面的语法:

DELIMITER CREATE TRIGGER trigger_name BEFORE UPDATE
ON table_name FOR EACH ROW
BEGIN
   variable declarations
   trigger code
END
DELIMITER ;

限制

  • 我们不能在BEFORE UPDATE触发器中更新旧值。
  • 我们可以更改新值。
  • 我们不能在视图上创建BEFORE UPDATE触发器。

BEFORE UPDATE触发器示例

让我们通过一个示例来了解如何使用MySQL中的CREATE TRIGGER语句创建BEFORE UPDATE触发器。

假设我们已经创建了一个名为 sales_info 的表,如下所示:

CREATE TABLE sales_info (
    id INT AUTO_INCREMENT,
    product VARCHAR(100) NOT NULL,
    quantity INT NOT NULL DEFAULT 0,
    fiscalYear SMALLINT NOT NULL,
    CHECK(fiscalYear BETWEEN 2000 and 2050),
    CHECK (quantity >=0),
    UNIQUE(product, fiscalYear),
    PRIMARY KEY(id)
);

接下来,我们将按照以下方式向sales_info表中插入一些记录:

INSERT INTO sales_info(product, quantity, fiscalYear)
VALUES
    ('2003 Maruti Suzuki',110, 2020),
    ('2015 Avenger', 120,2020),
    ('2018 Honda Shine', 150,2020),
    ('2014 Apache', 150,2020);

然后,执行 SELECT语句 ,以查看表数据如下:

MySQL BEFORE UPDATE触发器

下一步,我们将使用 CREATE TRIGGER 语句创建一个BEFORE UPDATE触发器。在表中发生更新事件之前,此触发器会自动被调用。

DELIMITER CREATE TRIGGER before_update_salesInfo
BEFORE UPDATE
ON sales_info FOR EACH ROW
BEGIN
    DECLARE error_msg VARCHAR(255);
    SET error_msg = ('The new quantity cannot be greater than 2 times the current quantity');
    IF new.quantity>old.quantity * 2 THEN
    SIGNAL SQLSTATE '45000'    SET MESSAGE_TEXT = error_msg;
    END IF;
END

DELIMITER ;

如果触发器成功创建,我们将获得以下输出:

MySQL BEFORE UPDATE触发器

如果我们将数量列中的值更新为当前值的两倍,则触发器会产生错误消息并停止更新。

让我们详细了解创建的触发器:

首先,在CREATE TRIGGER子句中指定触发器名称为befor_update_salesInfo。其次,指定触发事件,然后是触发器关联的表名。第三,我们声明一个变量并设置其值。最后,我们指定触发器体,检查新值是否是旧值的两倍,并引发错误。

如何调用BEFORE UPDATE触发器?

首先,我们可以使用以下语句更新id = 2的行的数量:

mysql> UPDATE sales_info SET quantity = 125 WHERE id = 2; 

这个语句很好用,因为它没有违反规则。接下来,我们将执行下面的语句,更新id为2的行的数量为600。

mysql> UPDATE sales_info SET quantity = 600 WHERE id = 2; 

它将会给出以下错误,因为它违反了规则。请查看下面的输出。

MySQL BEFORE UPDATE触发器

如何在MySQL Workbench中创建BEFORE UPDATE触发器?

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

MySQL BEFORE UPDATE触发器

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

1. 转到导航标签并单击包含 模式菜单 的菜单,该菜单包含 MySQL 服务器中可用的所有数据库。

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

MySQL BEFORE UPDATE触发器

3. 展开 表子菜单 ,并选择要创建触发器的表。选择表后,右键点击所选表(例如,sales_info),然后点击 Alter Table 选项。请参见下面的图片:

MySQL BEFORE UPDATE触发器

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

MySQL BEFORE UPDATE触发器

5. 现在,点击前面一节红色方框中显示的 触发器选项卡 ,然后选择Timing/Event BEFORE UPDATE。我们会注意到有一个(+)的图标按钮可以添加触发器。点击该按钮后,我们将得到一个基于选择的Timing/Event的默认触发器代码:

MySQL BEFORE UPDATE触发器

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

MySQL BEFORE UPDATE触发器

7. 点击“Apply”按钮后,点击 完成 按钮完成操作。

MySQL BEFORE UPDATE触发器

8. 如果我们查看模式菜单,我们将看到以下内容: 触发器 sales_info_before_update 在sales_info表下面:

MySQL BEFORE UPDATE触发器

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程