在MySQL中创建触发器

时间:2019-11-20 08:52:18  来源:igfitidea点击:

简介:在本教程中,您将学习如何使用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 EventOLDNEW
INSERTNoYes
UPDATEYesYes
DELETEYesNo

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语句在数据库中创建新触发器。