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 Block:最后,我们将指定触发器激活时执行的语句。如果我们要执行多个语句,我们将使用包含一组查询的 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 修饰符的可用性:
触发事件 | 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);
执行上述语句后,我们会得到如下输出:
在这个输出中,我们可以看到,在将负值插入表的 working_hours 列时,触发器会自动填充零值。
热门文章
优秀文章