我是靠谱客的博主 闪闪溪流,最近开发中收集的这篇文章主要介绍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中

最后

以上就是闪闪溪流为你收集整理的mysql 触发器详解的全部内容,希望文章能够帮你解决mysql 触发器详解所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部