在日常开发工作中,我们有时候处于业务的需要,有时候就要用到触发器,或者是在面试时,面试官会问及关于触发器的知识,接下来就讲解下触发器:
在工作中有的时候数据库数据会自动的进行变更,这时就可能是触发器的原因导致某个条件下触发了触发器脚本,导致数据变更,在排查问题的时候,就需要查看都有哪些触发器以及读懂相关的脚本。
查询当前数据库中已经存在的触发器任务脚本SQL show triggers
在执行了该指令以后,将会显示已经存在的触发器任务详细信息,详视下图

在通过上图中的statement中就是名称为trigger的触发器任务脚本。
下面小山羊就来针对触发器的相关特殊属性字段进行下剖解:
CREATE
[DEFINER = { user | CURRENT_USER }]
TRIGGER trigger_name
trigger_time trigger_event
ON tbl_name FOR EACH ROW
[trigger_order]
trigger_body
trigger_time: { BEFORE |AFTER }
trigger_event: { INSERT |UPDATE | DELETE }
trigger_order: { FOLLOWS |PRECEDES } other_trigger_name;
注释:
before 是在---之前执行,after是在---之后执行
trigger_event:
1、INSERT型触发器:插入某一行时激活触发器,可能通过INSERT
LOAD DATA、REPLACE 语句触发(LOAD DAT语句用于将一个文件装入到一个数据表中,相当与一系列的INSERT操作);
2、UPDATE型触发器:更改某一行时激活触发器,可能通过UPDATE语句触发;
3、DELETE型触发器:删除某一行时激活触发器,可能通过DELETE、REPLACE语句触发。
trigger_order是MySQL5.7之后的一个功能,用于定义多个触发器,使用follows(尾随)或precedes(在…之先)来选择触发器执行的先后顺序。
CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句;
示例:创建一个触发器,当对某张表进行操作后,进行记录
create triggerinsertusertrigger after INSERT
on user_tab for each ROW
insert
intoedit_log_tab(update_user,update_time)values('wuyuquan',NOW());
注释:该触发器的原理是:当有数据插入到user_tab表后,就插入数据至edit_log_tab表中记录;
CREATE TRIGGER edit_usersAFTER UPDATE ON user_tab FOR EACH ROW INSERT INTO update_log_tab (date_time,update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
注释:创建触发器名为edit_users 当user_tab表数据被修改后,往表update_log_tab中插入对应的修改IP和时间;
创建执行多条任务的触发器
CREATE TRIGGER edit_users AFTER UPDATE ON user_tab FOR EACH ROW
BEGIN
insert intoedit_log_tab(update_time,update_user)values(now(),'89852');
INSERT INTO update_log_tab(date_time, update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
END
;
当表user_tab表数据被修改时,同时往edit_log_tab表和update_log_tab表插入数据;
NEW可读可写:
CREATE TRIGGER edit_users before UPDATE ON user_tab FOR EACH ROW
BEGIN
IF
new.user_id='xiaoshanyang' THEN
insert into edit_log_tab(update_time,update_user)values(now(),'xiaoshanyang');
INSERT INTO update_log_tab(date_time, update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
elseif new.user_id='xiaoshanyang@31' THEN
insert into edit_log_tab(update_time,update_user)values(now(),'xiaoshanyang@31');
INSERT INTO update_log_tab(date_time, update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
end if;
END
;
OLD只读:
CREATE TRIGGER edit_users before UPDATE ON user_tab FOR EACH ROW
BEGIN
IF
old.user_id='wuyuquan' THEN
insert into edit_log_tab(update_time,update_user)values(now(),old.user_id);
INSERT INTO update_log_tab(date_time, update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
elseif old.user_id='wuyuquan@31' THEN
insert into edit_log_tab(update_time,update_user)values(now(),old.user_id);
INSERT INTO update_log_tab(date_time, update_ip)
VALUES
(
NOW(),
(
SELECT
SUBSTRING_INDEX(HOST, ':', 1) AS ip
FROM
information_schema. PROCESSLIST
GROUP BY
ip
)
);
end if;
END;




