在MySQL中创建触发器
简介:在本教程中,您将学习如何使用MySQL CREATE TRIGGER语句在数据库中创建触发器。
MySQL CREATE TRIGGER语句简介
CREATE TRIGGER语句创建一个新的触发器。
这是CREATE TRIGGER语句的基本语法:
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE| DELETE }
ON table_name FOR EACH ROW
trigger_body;
使用以下语法:
- 首先,在CREATE TRIGGER关键字之后指定要创建的触发器的名称。 
 请注意,触发器名称在数据库中必须唯一。
- 接下来,指定触发器动作时间,可以是BEFORE之前或AFTER之后,它指示在修改每行之前或之后调用触发器。 
- 然后,指定激活触发器的操作,可以是INSERT,UPDATE或DELETE。 
- 之后,在ON关键字之后指定触发器所属的表的名称。 
- 最后,指定触发触发器时要执行的语句。 
 如果要执行多个语句,请使用BEGIN END复合语句。
触发器主体可以访问受DML语句影响的列的值。
要区分DML触发之前和之后的列值,请使用NEW和OLD修饰符。
例如,如果更新列描述,则在触发器主体中,可以在更新OLD.description和新值NEW.description之前访问描述的值。
下表说明了OLD和NEW修饰符的可用性:
| Trigger Event | OLD | NEW | 
| INSERT | No | Yes | 
| UPDATE | Yes | Yes | 
| DELETE | Yes | No | 
MySQL触发器示例
让我们开始在MySQL中创建一个触发器来记录employee表的更改。
首先,创建一个名为employees_audit的新表以保留对employees表的更改:
CREATE TABLE employees_audit (
    id INT AUTO_INCREMENT PRIMARY KEY,
    employeeNumber INT NOT NULL,
    lastname VARCHAR(50) NOT NULL,
    changedat DATETIME DEFAULT NULL,
    action VARCHAR(50) DEFAULT NULL
);
接下来,创建一个BEFORE UPDATE触发器,该触发器在对employees表进行更改之前被调用。
CREATE TRIGGER before_employee_update 
    BEFORE UPDATE ON employees
    FOR EACH ROW 
 INSERT INTO employees_audit
 SET action = 'update',
     employeeNumber = OLD.employeeNumber,
     lastname = OLD.lastname,
     changedat = NOW();
在触发器主体内,我们使用OLD关键字访问employeeNumber列的值和受触发器影响的行的姓氏。
然后,使用SHOW TRIGGERS语句显示当前数据库中的所有触发器:
SHOW TRIGGERS;
此外,如果您在雇员>触发器下使用MySQL Workbench查看架构,则会看到before_employee_update触发器,如以下屏幕截图所示:
之后,在employees表中更新一行:
UPDATE employees 
SET 
    lastName = 'Phan'
WHERE
    employeeNumber = 1056;
最后,查询employees_audit表以检查触发器是否被UPDATE语句触发:
SELECT * FROM employees_audit;
从输出中可以清楚地看到,触发器被自动调用并将新行插入employee_audit表中。
在本教程中,您学习了如何使用MySQL CREATE TRIGGER语句在数据库中创建新触发器。

