如何使用 MySQL BEFORE 触发器?

2025年3月17日 | 阅读 10 分钟

在 MySQL 中,BEFORE 触发器是一个数据库对象,您可以定义它在指定事件(例如 UPDATE、INSERT 或 DELETE)发生之前自动执行。触发器允许您根据数据库中发生的特定事件来执行自定义代码或执行某些操作。

BEFORE 触发器在实际操作执行之前执行,可用于修改数据或执行额外的验证或计算。在本文中,我们将学习如何使用 MySQL BEFORE 触发器。

MySQL BEFORE 触发器的语法和结构

triggerName: 这是您分配给触发器的名称。

triggerTime: 指示触发器应在指定事件之前执行。

triggerEvent: 它指定第一个触发器要触发的数据库事件。

tableName: 这是应用触发器的表的名称。

FOR EACH ROW: 它决定了触发器应该为每一行受影响的行执行。

BEGIN 和 END: 包含一个或多个 SQL 语句的触发器主体。

关于 MySQL BEFORE 触发器的一些注意事项

  • BEFORE 触发器非常适合强制执行数据完整性和执行数据验证;这意味着您可以使用第一个触发器在允许任何操作之前确保特定字段不为空、强制唯一约束或验证数据格式。
  • 在利用触发器记录对表的更改之前,您可以创建一个审计跟踪,通过捕获有关更改的关联信息(如用户、时间戳和修改后的值)来跟踪和维护数据历史记录。
  • BEFORE 触发器可以自动化涉及多个表的复杂操作,并且您可以使用 BEFORE 触发器根据特定条件更新相关表或跨实体同步数据。
  • 触发器应简洁,专注于基本任务,并避免不必要的复杂性。复杂的触发器会影响性能和可维护性。
  • 在将触发器部署到生产环境之前,请在受控环境中对其进行彻底测试,以确保它们按预期工作并且不会导致任何意外问题。
  • 为每个触发器维护清晰的文档,例如其目的、行为和任何依赖项。这有助于简化数据库的理解和维护。
  • 过度使用触发器会影响数据库性能,因此在必要时进行优化很重要。

MySQL BEFORE 触发器的类型

MySQL BEFORE 触发器有三种类型:BEFORE INSERT 触发器、BEFORE UPDATE 触发器和 BEFORE DELETE 触发器。

1. BEFORE INSERT 触发器

在 MySQL 中,BEFORE INSERT 触发器是一个数据库对象,它允许您在对表执行插入操作之前自动执行操作。它是一种数据库触发器,在数据实际插入表之前触发。

当在表上定义了 INSERT 触发器时,该触发器将在实际插入发生之前执行。它允许您修改要插入的数据或根据特定条件执行其他操作。

语法

在上面的示例中,“triggerName”是您分配给触发器的名称,“tableName”是创建触发器的表的名称,“columnName”是表中特定列的名称。您可以在 BEGIN 和 END 块中定义自定义逻辑和函数。

示例 1

让我们创建一个名为 'train_passengers' 的表,其中包含 Id、Name、Address 和 ticketCharges 等字段。使用给定的语句创建表

表已创建,它将如下图所示

ID名称地址ticketCharges
 
 

在 'train_passengers' 表中插入值后,它将如下所示:

ID名称地址ticketCharges
115Chaitali博帕尔4500
154HimeshGhaziabad6000
326Harshad海得拉巴5000
454Naman孟买6500

现在,我们将创建一个名为 'train_ticket' 的触发器,当在新乘客记录插入到表中时,它会将票价扣除 ₹1000。使用给定的语句创建触发器

创建触发器后,执行它。

现在,我们将使用给定的命令向 'train_passengers' 表插入一条新记录

使用以下语句查看结果

如下所示,新票价已扣除 ₹1000。

How to use MySQL Before Trigger

示例 2

让我们创建一个名为 'employees' 的表,其中包含 Id、Name、Age、Address 和 Income 等字段。

使用给定的命令创建 'employees' 表

表已创建,它将如下图所示

ID名称年龄地址收入
 

现在,我们将使用给定的命令在 'employees' 表中插入值

在 'employees' 表中插入值后,它将如下所示:

ID名称年龄地址收入
101Anjali35Meerut39000
102Divya27Meerut40000
103尼莎32博帕尔45000
104Ishan34昌迪加尔37000

我们将创建一个名为 'income_update' 的触发器,用于更新表中新员工的薪水。如果新员工的薪水低于 30000,则新员工的薪水将更新为 30000。我们将使用以下语句创建触发器

创建触发器后,执行它。

现在,我们将使用以下语句向 'employees' 表插入一条新记录

执行上述语句后,我们将使用以下语句显示 'employees' 表

如下所示,添加到表中的新员工的收入已更新为 30000。

How to use MySQL Before Trigger

2. BEFORE UPDATE 触发器

在 MySQL 中,BEFORE UPDATE 触发器是与特定表关联的数据库对象,它在对该表执行 UPDATE 操作之前自动执行操作。它允许您定义必须在修改表中的数据之前应用的自定义操作。

语法

在上面的示例中,“triggerName”是您分配给触发器的名称,“tableName”是创建触发器的表的名称,“columnName”是表中特定列的名称。您可以在 BEGIN 和 END 块中定义自定义逻辑和函数。

示例 1

让我们创建一个名为 'Laptops' 的表,其中包含 Id、ModelNumber、ModelName、Price、Insurance 和 Quantity 等字段。

使用给定的命令创建 'Laptops' 表

表已创建,它将如下图所示

IDModelNumberModelName价格保险数量
 

现在,我们将使用给定的命令在 'Laptops' 表中插入值

在 'Laptops' 表中插入值后,它将显示如下:

IDModelNumberModelName价格保险数量
15124HP Ryzen 5450002002
25695Dell Inspiron 14550001806
34524ASUS Vivobook 16452001206
45795Lenovo ThinkBook 15356001405
51216ASUS Vivobook 14350001502
61221Dell Inspiron 16520001306

我们将创建一个名为 'Validate' 的触发器,用于更新表中笔记本电脑的价格。我们将使用以下语句创建触发器

现在,我们将使用以下命令更新笔记本电脑价格

如您所见,由于价格低于 1000,将显示错误。

How to use MySQL Before Trigger

现在,使用以下命令查看 'Laptops' 表,以查看价格是否已更改。

如您所见,价格保持不变。

How to use MySQL Before Trigger

示例 2

让我们创建一个名为 'staff' 的表,其中包含 Id、Name、Age、Address 和 Wage 等字段。

使用给定的命令构建 'staff' 表

表已创建,它将如下图所示

ID名称年龄地址Wage
 

现在,我们将使用给定的命令在 'staff' 表中插入值

在 'staff' 表中插入值后,它将如下所示:

ID名称年龄地址Wage
1Himanshu25Roorkee25000
2Vaibhav26Meerut26000
3Anushka28Roorkee30000
4Avni30果阿31000
5Khushi32勒克瑙32000

我们将创建一个名为 'update_wage' 的触发器,用于根据特定条件更新表中员工的工资。我们将使用给定的语句创建触发器

现在,我们将使用给定的命令更新员工工资

现在,使用以下命令查看 'staff' 表,以查看工资是否已更改。

如您所见,Id=2 的员工的工资已更改。

How to use MySQL Before Trigger

3. BEFORE DELETE 触发器

在 MySQL 中,BEFORE DELETE 触发器是与表关联的数据库对象,它设计在对表执行 DELETE 操作之前自动执行操作。

语法

在上面的示例中,“triggerName”是您分配给触发器的名称,“tableName”是创建触发器的表的名称,“columnName”是表中特定列的名称。您可以在 BEGIN 和 END 块中定义自定义逻辑和函数。

示例 1

让我们创建一个名为 'customers' 的表,其中包含 Id、Name、Age、Address 和 PhoneNumber 等字段。

使用给定的命令构建 'customers' 表

表已创建,它将如下图所示

ID名称年龄地址PhoneNumber
 

现在,我们将使用给定的命令在 'customers' 表中插入值

在 'customers' 表中插入值后,它将如下所示:

ID名称年龄地址PhoneNumber
1Rohit25孟买9652320000
2Aryan23果阿9561310000
3Sakshi19勒克瑙8562310000
4Naveen27Kanpur8525850000
5Harshita24Meerut9656230000

我们将使用给定的语句创建一个名为 'before_delete' 的触发器

现在,我们将使用给定的命令从 'customers' 表中删除

如您所见,应用 DELETE 触发器后会显示错误。

How to use MySQL Before Trigger

现在,我们将使用给定的语句查看 'customers' 表

如下所示,没有任何内容被删除。

How to use MySQL Before Trigger

示例 2

让我们创建一个名为 'labour' 的表,其中包含 Id、Name、Age、Address 和 Payment 等字段。

使用给定的命令构建 'labour' 表

表已创建,它将如下图所示

ID名称年龄地址支付
 

现在,我们将使用给定的命令在 'labour' 表中插入值

在 'labour' 表中插入值后,它将如下所示:

ID名称年龄地址支付
1Rekha32Meerut11000
2Neetu35班加罗尔10000
3Salman38果阿12000
4Harsh29Meerut14000
5Nishant28班加罗尔16000

我们将使用给定的语句创建一个名为 'before_delete' 的触发器

现在,我们将使用以下命令从 'labour' 表中删除

如您所见,应用 DELETE 触发器后会显示错误。

How to use MySQL Before Trigger

现在,我们将使用给定的语句查看 'labour' 表

如下所示,没有任何内容被删除。

How to use MySQL Before Trigger

结论

在本文中,我们学习了如何使用 MySQL BEFORE 触发器。我们了解到 BEFORE 触发器有三种类型:BEFORE UPDATE 触发器、BEFORE INSERT 触发器和 BEFORE DELETE 触发器。我们通过示例已充分理解了每种 BEFORE 触发器的类型。