#粤嵌我来了##粤嵌星计划#
粤嵌星计划挑战
今天打卡第84天
一、什么是触发器
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.
TRIGGERSa [ where a.TRIGGER_NAME = 'update_client' ] ;
四、删除触发器
DROP TRIGGER IF EXISTS update_client ;
五、触发器的执行顺序
1.我们建立的数据库一般都是innoDB数据库,若sql语句或触发器执行失败,mysql会自动使用回滚事物有:
1.若before触发器执行失败,则sql无法正常执行。
2.若sql执行失败时候,after型触发器不会触发
3.after触发器执行失败,则sql会混滚。
2.执行顺序图解