求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 

mysql教程
MySQL快速学习入门
MySQL是什么
MySQL安装
MySQL示例数据库
MySQL导入示例数据库
MySQL基础教程
MySQL查询数据
MySQL WHERE语句
MySQL插入数据
MySQL更新表数据
MySQL删除表数据
MySQL创建与删除数据库
MySQL创建表
MySQL修改表结构
MySQL重命名表
MySQL数据类型
高级部分
MySQL技巧
MySQL存储过程
MySQL视图
MySQL触发器
MySQL管理
MySQL全文搜索
MySQL函数
应用程序连接
MySQL+Node.js连接和操作
Python+MySQL连接和操作
 
 

MySQL触发器创建
475 次浏览
2次  

在本教程中,您将学习如何使用CREATE TRIGGER语句在MySQL中创建触发器。

应该先阅读SQL触发器的简介,并在开始本教程之前先来了解触发MySQL的实现。

MySQL触发语法

为了创建一个新的触发器,可以使用CREATE TRIGGER语句。 下面说明了CREATE TRIGGER语句的语法:

CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
...
END;

下面,我们来更详细的检查上面的语法。

将触发器名称放在CREATE TRIGGER语句之后。触发器名称应遵循命名约定[trigger time]_[table name]_[trigger event],例如before_employees_update。

触发激活时间可以在之前或之后。必须指定定义触发器的激活时间。如果要在更改之前处理操作,则使用BEFORE关键字,如果在更改后需要处理操作,则使用AFTER关键字。

触发事件可以是INSERT,UPDATE或DELETE。此事件导致触发器被调用。 触发器只能由一个事件调用。要定义由多个事件调用的触发器,必须定义多个触发器,每个事件一个触发器。

触发器必须与特定表关联。没有表触发器将不存在,所以必须在ON关键字之后指定表名。

将SQL语句放在BEGIN和END块之间。这是定义触发器逻辑的位置。

MySQL触发器示例

下面我们将在MySQL中创建触发器来记录employees表中行数据的更改情况。

mysql> DESC employees;
+----------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| employeeNumber | int(11) | NO | PRI | NULL | |
| lastName | varchar(50) | NO | | NULL | |
| firstName | varchar(50) | NO | | NULL | |
| extension | varchar(10) | NO | | NULL | |
| email | varchar(100) | NO | | NULL | |
| officeCode | varchar(10) | NO | MUL | NULL | |
| reportsTo | int(11) | YES | MUL | NULL | |
| jobTitle | varchar(50) | NO | | NULL | |
+----------------+--------------+------+-----+---------+-------+
8 rows in set

首先,创建一个名为employees audit的新表,用来保存employees表中数据的更改。 以下语句创建employee_audit表。

USE yiibaidb;
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表中的行记录更改之前被调用。

DELIMITER $$
CREATE TRIGGER before_employee_update
BEFORE UPDATE ON employees
FOR EACH ROW
BEGIN
INSERT INTO employees_audit
SET action = 'update',
employeeNumber = OLD.employeeNumber,
lastname = OLD.lastname,
changedat = NOW();
END$$
DELIMITER ;

在触发器的主体中,使用OLD关键字来访问受触发器影响的行的employeeNumber和lastname列。

请注意,在为INSERT定义的触发器中,可以仅使用NEW关键字。不能使用OLD关键字。但是,在为DELETE定义的触发器中,没有新行,因此您只能使用OLD关键字。在UPDATE触发器中,OLD是指更新前的行,而NEW是更新后的行。

然后,要查看当前数据库中的所有触发器,请使用SHOW TRIGGERS语句,如下所示:

SHOW TRIGGERS;

执行上面查询语句,得到以下结果 -

mysql> SHOW TRIGGERS;
+-------+--------+----+----+----------------+------+-----+---+
| Trigger | Event | Table | Statement | Timing | Created | sql_mode |
Definer | character_set_client | collation_connection |
Database Collation |
+-------+--------+----+----+----------------+------+-----+---+
| before_employee_update | UPDATE | employees | BEGIN
INSERT INTO employees_audit
SET action = 'update',
employeeNumber = OLD.employeeNumber,
lastname = OLD.lastname,
changedat = NOW();
END | BEFORE | 2017-08-02 22:06:36.40 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | utf8 | utf8_general_ci | utf8_general_ci |
+-------+--------+----+----+----------------+------+-----+---+
1 row in set

之后,更新employees表以检查触发器是否被调用。

UPDATE employees
SET
lastName = 'Maxsu'
WHERE
employeeNumber = 1056;

最后,要检查触发器是否被UPDATE语句调用,可以使用以下查询来查询employees_audit表:

SELECT * FROM employees_audit;

以下是查询的输出:

mysql> SELECT * FROM employees_audit;
+----+----------------+----------+---------------------+--------+
| id | employeeNumber | lastname | changedat | action |
+----+----------------+----------+---------------------+--------+
| 1 | 1056 | Hill | 2017-08-02 22:15:51 | update |
+----+----------------+----------+---------------------+--------+
1 row in set

如上面输出结果所示,触发器被真正调用,并在employees_audit表中插入一个新行。

在本教程中,您已经学会了如何在MySQL中创建一个触发器。我们还向您展示了如何开发触发器来审计员工(employees)表的更改。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



475 次浏览
2次
 捐助