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语句 来验证插入的记录:
接下来,我们将创建一个 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> INSERT INTO employee VALUES
('Markus', 'Former', '2020-10-08', 14);
mysql> INSERT INTO employee VALUES
('Alexander', 'Actor', '2020-10-012', -13);
在执行上述语句后,我们将获得如下输出:
在此输出中,我们可以看到将负值插入工作小时列的表格时,触发器将自动用零值填充。