程序员社区

MySQL系列教程 --- 92、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 语句影响的列值。的NEWOLD改性剂被用于区分的列值BEFOREAFTER DML语句的执行。我们可以使用带有 NEW 和 OLD 修饰符的列名作为OLD.col_nameNEW.col_name。OLD.column_name 指示更新或删除发生之前现有行的列。NEW.col_name 表示将要插入的新行的列或更新后的现有行。

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

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

触发器事件 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 语句来验证插入的记录:

file

接下来,我们将创建一个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 //  

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

file

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

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

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

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

file

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

赞(0) 打赏
未经允许不得转载:IDEA激活码 » MySQL系列教程 --- 92、MySQL 创建触发器

一个分享Java & Python知识的社区