MySQL 创建触发器

MySQL 创建触发器

在本文中,我们将学习如何在MySQL中创建第一个触发器。通过使用CREATE TRIGGER语句可以在MySQL中创建新的触发器。在使用CREATE TRIGGER命令时,需要确保我们拥有触发器特权。以下是创建触发器的基本语法:

CREATE TRIGGER trigger_name  trigger_time trigger_event
ON table_name FOR EACH ROW
BEGIN
    --variable declarations
    --trigger code
END;  

参数说明

创建触发器的语法包含以下参数:

trigger_name: 这是我们想要创建的触发器的名称。必须在CREATE TRIGGER语句之后书写。确保触发器的名称在模式中是唯一的。

trigger_time: 这是触发器的执行时间,可以是BEFORE或AFTER。定义触发器时是必需的参数。它表示触发器将在表上每次行修改发生之前或之后被调用。

trigger_event: 这是激活触发器的操作类型名称。可以是INSERT、UPDATE或DELETE操作。触发器只能激活一个事件。如果我们想要定义一个由多个事件激活的触发器,必须定义多个触发器,每个事件一个。

table_name: 这是触发器所关联的表的名称。必须在ON关键字之后书写。如果我们没有指定表名,触发器将不存在。

BEGIN END块: 最后,我们将为触发器激活时执行的语句进行指定。如果我们想要执行多个语句,将使用包含一组查询的BEGIN END块来定义触发器的逻辑。

触发器体可以访问受DML语句影响的列的值。使用NEW和OLD修饰符来区分列的值在DML语句执行之前和之后的情况。我们可以使用带有NEW和OLD修饰符的列名,例如OLD.col_name和NEW.col_name。OLD.column_name表示更新或删除发生之前的现有行的列。NEW.col_name表示将被插入的新行或在更新后的现有行的列。

例如 ,假设我们想要使用触发器更新列名为message_info。在触发器体中,我们可以访问更新之前的列值为OLD.message_info,以及新值为NEW.message_info。

我们可以通过下表了解OLD和NEW修饰符的可用性:

Trigger Event OLD NEW
INSERT No Yes
UPDATE Yes Yes
ELETE Yes No

MySQL触发器示例

让我们从在MySQL中创建一个触发器开始,该触发器对员工表进行修改。首先,我们将通过执行以下语句创建一个名为 employee 的新表:

CREATE TABLE employee(
    name varchar(45) NOT NULL,  
    occupation varchar(35) NOT NULL,  
    working_date date,
    working_hours varchar(10)
);

接下来,执行以下语句将记录 填充到员工表中:

INSERT INTO employee VALUES  
('Robin', 'Scientist', '2020-10-04', 12),
('Warner', 'Engineer', '2020-10-04', 10),
('Peter', 'Actor', '2020-10-04', 13),
('Marco', 'Doctor', '2020-10-04', 14),
('Brayden', 'Teacher', '2020-10-04', 12),
('Antonio', 'Business', '2020-10-04', 11);

下一步,执行 SELECT语句 来验证插入的记录:

MySQL 创建触发器

接下来,我们将创建一个 BEFORE INSERT触发器 。当有人尝试插入 working_hours < 0时,此触发器会自动插入 working_hours = 0

mysql> DELIMITER //
mysql> Create Trigger before_insert_empworkinghours 
BEFORE INSERT ON employee FOR EACH ROW
BEGIN
IF NEW.working_hours < 0 THEN SET NEW.working_hours = 0;
END IF;
END //

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

MySQL 创建触发器

现在,我们可以使用以下语句来调用这个触发器:

mysql> INSERT INTO employee VALUES  
('Markus', 'Former', '2020-10-08', 14);

mysql> INSERT INTO employee VALUES  
('Alexander', 'Actor', '2020-10-012', -13);

在执行上述语句后,我们将获得如下输出:

MySQL 创建触发器

在此输出中,我们可以看到将负值插入工作小时列的表格时,触发器将自动用零值填充。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程