mysql 触发器详解

啥是触发器呢

在对数据进行增删改的前后触发的功能被叫做触发器

为啥要用触发器

在对数据进行增删改的时候,可以通过触发器来做点别的事情,你比如说执行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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值