概述
啥是触发器呢
在对数据进行增删改的前后触发的功能被叫做触发器
为啥要用触发器
在对数据进行增删改的时候,可以通过触发器来做点别的事情,你比如说执行sql语句呀
创建触发器
-- 固定的格式
create trigger tri_name after|before on tname for each row
begin
query -- 这里是要执行的sql语句
end
delimiter
用来修改mysql执行sql语句的结束符号,由于默认用 ; ,如果不修改结束符号,我们在触发器里面执行sql语句的时候,肯定会报错的,如下
mysql> create trigger tri_insert_after after insert on class for each row
-> begin
-> insert into class(id,name) values (5,'高一二班');
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 3
正确的处理方式
在开始的地方修改sql结束符号
在最后修改过来sql结束符号
如下代码
delimiter $$
create trigger tir_name for each row
begin
insert into tname(name) values ('egon');
end $$
delimiter ;
针对tname表插入数据前后的触发器
-- insert into after trigger
-- 在插入语句之后在erro表里面插入数据
create trigger tri_insert_after after insert on tname for each row
begin
insert into erro(name) values ('insert after err 0');
end
-- insert into before trigger
-- 在插入语句之前在erro表里面插入数据
create trigger tri_insert_before before insert on tname for each row
begin
insert into erro(name) values ('insert before err 0');
end
针对tname表更新数据前后的触发器
-- update after trigger
-- 更新数据之后的触发器
create trigger tri_update_after update on tname for each row
begin
insert into erro(name) values ('update after err 0');
end
-- update before trigger
-- 更新数据之前的触发器
create trigger tri_update_before update on tname for each row
begin
insert into erro(name) values ('update before err 0');
end
针对tname表删除数据前后的触发器
-- delete after trigger
-- 删除数据之后的触发器
create trigger tri_del_after delete on tname for each row
begin
insert into erro(name) values ('delete after err 0');
end
-- delete before trigger
-- 删除数据之前的触发器
create trigger tri_del_before delete on tname for each row
begin
insert into err(name) values ('delete before err 0');
end
小案例 来一个
-- 建立两个表
create table cmd(
id int primary key auto_increment,
cmd char(60),
sub_time datetime,
succ enum('yes','no'));
create table errlog(
id int primary key auto_increment,
err_cmd char(60),
err_time datetime);
-- 创建触发器
delimiter $$
create trigger tri_insert_after after insert on cmd for each row
begin
if NEW.succ = 'no' then
insert into errlog(err_cmd,err_time) values (NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ;
-- cmd 插入数据
insert into cmd (cmd, sub_time, succ) values
('ls -l /etc',NOW(),'yes'),
('cat /my.conf',NOW(),'no'),
('cd /usr/local/',NOW(),'no'),
('ps aux | grep mysql',NOW(),'yes');
我们没有对errlog表插入数据,现在查询看一下
select * from errlog;
mysql> select * from errlog;
+----+----------------+---------------------+
| id | err_cmd | err_time |
+----+----------------+---------------------+
| 1 | cat /my.conf | 2019-05-17 15:54:48 |
| 2 | cd /usr/local/ | 2019-05-17 15:54:48 |
+----+----------------+---------------------+
2 rows in set (0.00 sec)
删除触发器
drop trigger tri_insert_after;
特别注意的 ⭐️
NEW表示即将插入的数据,就是在insert into之后返回的插入数据,mysql存放在NEW当中
OLD表示即将删除的数据,就是在delete之后返回的删除数据,mysql存放到OLD中
最后
以上就是闪闪溪流为你收集整理的mysql 触发器详解的全部内容,希望文章能够帮你解决mysql 触发器详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复