触发器介绍
触发器是与表有关的数据库对象,指在insert/update/delete
之前(BEFORE)或之后(AFTER),触发并执行触发器中定义的SQL
语句集合。
语法
触发器的语法包括触发器的创建、查看以及删除。
创建触发器:
CREATE TRIGGER trigger_name
BEFORE/AFTER trigger_event
ON tbl_name FOR EACH ROW -- 行级触发器
BEGIN
trigger_stmt ;
END;
说明:
- trigger_name 为触发器的名称,应遵循命名约定
[trigger time]_[table name]_[trigger event]
,例如before_employees_update
; - BEFORE/AFTER 为触发激活时间,如果想在事件执行之前触发,就使用
BEFORE
,否则就使用AFTER
; - trigger_event 为触发事件,可以是
INSERT
,UPDATE
或DELETE
; - 触发器必须与特定表关联。没有表触发器将不存在,所以必须在
ON
关键字之后指定表名; BEGIN
和END
之间定义定义触发器逻辑。
查看触发器:
SHOW TRIGGERS;
删除触发器:
DROP TRIGGER [schema_name.] trigger_name; -- 如果没有指定 schema_name,默认为当前数据库 。
例子
通过触发器记录 tb_user
表的数据变更日志,将变更日志添加到日志表 user_logs
中,以更新为例。
tb_user
表结构如下:
先创建 user_logs
表,结构如下:
接下来创建一个 BEFORE UPDATE
触发器,该触发器在对 tb_user
表中的行记录更改之前被调用。
CREATE DEFINER=`root`@`localhost` TRIGGER `before_user_update` BEFORE UPDATE ON `tb_user` FOR EACH ROW BEGIN
INSERT INTO
tb_users_logs(`operation` ,`operate_time` ,`operate_id` ,`operate_params` )
VALUES('update',NOW(),new.id,CONCAT('[update] ','更新前的数据:name=',old.name,',age=',old.age,',gender=',old.gender,' | 更新后的数据:name=',new.name,',age=',new.age,',gender=',new.gender));
END
我们把章北海的年龄修改为 37 岁,tb_users_logs
表里就多了一条数据,记录了修改前和修改后的数据,结果如下:
在 before_user_update
触发器的触发逻辑中有些陌生的东西:
'update',NOW(),NEW.id,CONCAT('[update] ','更新前的数据:name=',old.name,',age=',old.age,',gender=',old.gender,' | 更新后的数据:name=',new.name,',age=',new.age,',gender=',new.gender)
在这段语句中,new.id
、old.name
、old.age
、old.gender
、new.name
、new.age
、new.gender
代表什么意思呢?“.”后面的内容好理解,就是 tb_user
表的字段,但是“.”前面的 new
和 old
分别代表什么含义呢?
在触发器主体中,可以用 old
来访问 tb_user
表更新之前的数据,例如 old.age
访问的就是 tb_user
表更新之前 age
字段的值,为 35;new
则是用来访问tb_user
表更新之后的数据,例如 new.age
访问的就是 tb_user
表更新之后 age
字段的值,为 37,即:
- 用
old
访问触发前的数据; - 用
new
访问触发后的数据。
当然并不是所有的触发事件都可以用 new
或 old
访问触发前的数据或触发后的数据。例如 insert
触发事件,在添加数据前都没有对应数据,就不可能用 old
去访问触发前的数据,所以 insert
触发事件只能用 new
访问触发后的数据。以下是三种触发事件的 new
和 old
说明:
触发器类型 | NEW和OLD |
---|---|
INSERT | NEW 表示将要或者已经新增的数据 |
UPDATE | OLD 表示修改之前的数据 , NEW 表示将要或已经修改后的数据 |
DELETE | OLD 表示将要或者已经删除的数据 |
作用
- 确保数据的完整性;
- 日志记录;
- 数据校验。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。