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语句 ,以查看表数据如下:
下一步,我们将使用 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 ;
如果触发器成功创建,我们将获得以下输出:
如果我们将数量列中的值更新为当前值的两倍,则触发器会产生错误消息并停止更新。
让我们详细了解创建的触发器:
首先,在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 Workbench中创建BEFORE UPDATE触发器?
要使用MySQL Workbench创建BEFORE UPDATE触发器,我们首先需要启动它,并使用之前创建的用户名和密码登录。我们将获得以下屏幕:
现在按照以下步骤创建 BEFORE UPDATE 触发器:
1. 转到导航标签并单击包含 模式菜单 的菜单,该菜单包含 MySQL 服务器中可用的所有数据库。
2. 选择数据库(例如, employeedb ),双击它,并显示包含表、视图、函数和存储过程的 子菜单 。请参阅下面的屏幕截图。
3. 展开 表子菜单 ,并选择要创建触发器的表。选择表后,右键点击所选表(例如,sales_info),然后点击 Alter Table 选项。请参见下面的图片:
4. 单击“修改表”选项会显示如下屏幕:
5. 现在,点击前面一节红色方框中显示的 触发器选项卡 ,然后选择Timing/Event BEFORE UPDATE。我们会注意到有一个(+)的图标按钮可以添加触发器。点击该按钮后,我们将得到一个基于选择的Timing/Event的默认触发器代码:
6. 现在,完成触发器代码,再次审查它们,如果没有发现错误,请点击 Apply 按钮。
7. 点击“Apply”按钮后,点击 完成 按钮完成操作。
8. 如果我们查看模式菜单,我们将看到以下内容: 触发器 sales_info_before_update 在sales_info表下面: