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

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

技术教程推荐

玩转Spring全家桶 -〔丁雪丰〕

Flutter核心技术与实战 -〔陈航〕

DevOps实战笔记 -〔石雪峰〕

Go 并发编程实战课 -〔晁岳攀(鸟窝)〕

技术面试官识人手册 -〔熊燚(四火)〕

操作系统实战45讲 -〔彭东〕

手把手带你写一个MiniSpring -〔郭屹〕

结构思考力 · 透过结构看问题解决 -〔李忠秋〕

AI大模型企业应用实战 -〔蔡超〕

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