MySQL - 更新前触发

MySQL - 更新前触发 首页 / MySQL入门教程 / MySQL - 更新前触发

UPDATE之前,每当与触发器关联的表上触发更新操作时,都会自动调用MySQL中的触发器。在本文中,无涯教程将学习如何使用其语法和示例创建更新前触发器。

语法

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

无涯教程网

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

BEFORE UPDATE触发器语法参数的解释如下:

  • 首先,将指定要创建的触发名称(trigger_name)。它在架构中应该是唯一的。
  • 第二,将指定触发动作时间(BEFORE UPDATE),该时间应为UPDATE之前。在表的每一行更改发生之前,将触发此触发器。
  • 第三,将指定与触发器关联的表的名称(table_name)。它必须写在 ON关键字之后。如果不指定表名,则触发器将不存在。
  • 最后,将指定触发主体(trigger_body),其中包含在触发触发器时执行的语句。

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

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

限制条件

  • 无法在"BEFORE UPDATE"触发器中更新OLD值。
  • 可以更改新值。
  • 无法在VIEW上创建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 Trigger

接下来,无涯教程将使用 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 Trigger

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

详细了解创建的触发器:

首先,无涯教程在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 Trigger

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

从0开始学微服务 -〔胡忠想〕

Linux实战技能100讲 -〔尹会生〕

性能工程高手课 -〔庄振运〕

Service Mesh实战 -〔马若飞〕

Redis核心技术与实战 -〔蒋德钧〕

容器实战高手课 -〔李程远〕

说透元宇宙 -〔方军〕

云计算的必修小课 -〔吕蕴偲〕

后端工程师的高阶面经 -〔邓明〕

好记忆不如烂笔头。留下您的足迹吧 :)