MySQL BEFORE UPDATE触发器

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

一、MySQL 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 触发器中的旧值。
  • 我们可以更改新值。
  • 我们不能在 VIEW 上创建 BEFORE UPDATE 触发器。

二、MySQL 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语句查看表数据如下:

接下来,我们将使用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 ;  

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

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

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

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

三、如何调用 BEFORE UPDATE 触发器? 

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

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

这个声明很好用,因为它不违反规则。接下来,我们将执行以下语句,将行的数量更新为 600,其 id = 2

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

它将给出如下错误,因为它违反了规则。请参阅下面的输出。

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

使用MySQL Workbench创建 BEFORE UPDATE 触发器,我们首先需要启动它,然后使用我们之前创建的用户名和密码登录。我们将得到如下画面:

现在执行以下步骤来创建 BEFORE UPDATE 触发器:

1. 转到 Navigation 选项卡并单击包含MySQL中所有可用数据库的Schema 菜单服务器。

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

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

4. 点击 Alter Table 选项,屏幕如下:

5. 现在,单击上一节红色矩形框中显示的Trigger 选项卡,然后选择 Timing/Event BEFORE UPDATE。我们会注意到有一个 (+) 图标按钮来添加触发器。单击该按钮,我们将根据选择时间/事件获得触发的默认代码:

6. 现在,完成触发器代码,再次检查它们,如果没有发现错误,单击应用按钮。

7.点击Apply按钮后,点击Finish按钮完成。

8.如果我们在模式菜单中,我们将看到触发器sales_info表下的 sales_info_before_update 如下:

热门文章

优秀文章