MySQL触发器资料整理创建触发器及查看、删除触发器
一、什么是触发器
1、触发器是一种特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是通过事件来触发,比如对一个表进行操作(insert,delete,update)的时候,就会执行它。
2、区别:触发器与存储过程的唯一区别是触发器不能执行EXECUTE语句调用,而是在用户执行Transact-SQL语句时自动触发执行。
二、创建触发器
1、 语法
create
TRIGGER trigger_name
trigger_time trigger_event
ON table_name FOR EACH ROW
BEGIN
# do something
END;
2、关键词说明
a. trigger_name: 触发器名称,唯一不可重复的。
b. trigger_time: 触发器执行时间 。 {BEFORE / AFTER} 表示事件之前或之后执行。
c. trigger_event:触发触发器的事件。{INSERT / DELETE / UPDATE}某个事件执行
- INSERT 当新的一行数据插入表中时触发,如执行insert,load data,replace语句插入新数据
- DELETE 当表的一行数据被删除时触发,如执行delete,replace语句时
- UPDATE 当表的一行数据被修改时触发,如执行update语句时
d. table_name:触发器作用于某张表上。
3.1、示例 --- 创建一个 update 触发器
CREATE
TRIGGER update_client
AFTER UPDATE
on client for each ROW
BEGIN
INSERT INTO `client_log` (
`client_id`,
`modify_flag`,
`name`,
`contact`,
`phone`,
`email`,
`remarks`,
`del_flag`,
`create_date`,
`create_by`,
`update_date`,
`update_by`
)
VALUES(
old.id,
"修改--原数据",
old.name,
old.contact,
old.phone,
old.email,
old.remarks,
old.del_flag,
old.create_date,
old.create_by,
old.update_date,
old.update_by
);
END;
3.2、示例---创建一个 insert 触发器
DELIMITER $ # (使用 DELIMITER 将语句分隔符改为 $)
CREATE
TRIGGER insert_client
AFTER INSERT
on client for each ROW
BEGIN
INSERT INTO `chapter`.`client_log` (
`client_id`,
`modify_flag`,
`name`,
`contact`,
`phone`,
`email`,
`remarks`,
`del_flag`,
`create_date`,
`create_by`,
`update_date`,
`update_by`
)
VALUES(
new.id,
"新增数据",
new.name,
new.contact,
new.phone,
new.email,
new.remarks,
new.del_flag,
new.create_date,
new.create_by,
new.update_date,
new.update_by
);
END$
DELIMITER $
4、old 、 new 说明
a. old :表示 修改 或 删除 之前的字段数据
b. new:表示 修改之后 或 插入的字段数据。(插入 之前、之后都可以)
三、查看触发器
1、
show triggers ;
2、
SELECT a.* from information_schema.`TRIGGERS` a [ where a.TRIGGER_NAME = 'update_client' ] ;
四、删除触发器
1、 DROP TRIGGER IF EXISTS trigger_name ;
2、示例:
DROP TRIGGER IF EXISTS update_client ;
五、触发器的执行顺序
1、我们建立的数据库一般都是 InnoDB 数据库,若SQL语句或触发器执行失败,MySQL 会回滚事务,有:
①若 BEFORE 触发器执行失败,则 SQL 无法正确执行。
②若 SQL 执行失败时,则 AFTER 型触发器不会触发。
③若 AFTER 触发器执行失败,则 SQL 会回滚。
2、执行顺序图解
补充:若有疑问,可私信联系。 需要示例代码完整脚本,请私信,谢谢。