概述
触发器trigger ❗
定义:在满足特点条件后自动执行。
在MySQL只有三种情况下可以触发
1、针对表的增
增加数据前 增加数据后 可写一个触发器
2、针对表的改
修改数据前 修改数据后
3、针对表的删
删除数据前 删除数据后
# 语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row begin
sql语句
end
# 触发器的名字推荐使用下列方式(见名知意):
tri_after_insert_t1 : 在给t1表插入数据之后添加一个触发器
# 六种情况演示
# 六种情况演示
增加:
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
sql语句
end # 增加之后触发
create trigger tri_before_insert_t1 before insert on 表名 for each row
begin
sql语句
end # 增加之前触发
修改:
create trigger tri_after_update_t1 after update on 表名 for each row
begin
sql语句
end # 修改之后触发
create trigger tri_before_updata_t1 before update on 表名 for each row
begin
sql语句
end # 修改之前触发
删除:
create trigger tri_after_delete_t1 after delete on 表名 for each row
begin
sql语句
end # 删除之后触发
create trigger tri_before_delete_t2 before delete on 表名 for each row
begin
sql语句
end # 删除之前触发
补充:
需要注意:在书写sql语句的时候结束符是; 而整个触发器结束时也需要用到分号;就会出现语法冲突,需要修改我们的结束符号。
临时修改sql语句的结束符号:只在当前窗口有效
结构: delimiter 新符号
案例: delimiter $$
触发器案例:
补充:在mysql中new特指数据对象可以通过点(.)的方式获取字段对应的数据
eg : id :1 name :gary pwd :123 hobby :read
NEW.name的结果就为 : gary
# 模拟cmd命令表
create table cmd (
id int primary key auto_increment, # 主键字段
USER char (32),
priv char (10),
cmd char (64), # cmd命令字段
sub_time datetime, # 提交时间
success enum ('yes', 'no')
);
# 错误日志表
create table errlog (
id int primary key auto_increment,
err_cmd char (64),
err_time datetime
);
# 创建触发器
delimiter $$ # 将mysql默认结束符;换为$$
create trigger tri_afrer_insert_cmd after insert on cmd for each row # 在insert插入数据之后创建触发器
begin # 触发器代码
if NEW.success = 'no' then # mysql中if语句固定格式
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ; # 结束触发器要把默认结束回来 不然后续操作容易混淆
# 往cmd表中插入数据,触发触发器,根据if的条件决定是否插入错误日志
insert into cmd (USER,priv,cmd,sub_time,success) values
('tony','0755','ls -l /etc',NOW(),'yes'),
('tony','0755','cat /etc/passwd',NOW(),'no'),
('tony','0755','useradd xxx',NOW(),'no'),
('tony','0755','ps aux',NOW(),'yes');
验证触发器:
# 查询errlog表记录
select * from errlog;
# 结果:在插入数据后自动给errlog表插入里两条数据 并且这两条数据为插入success为'no'的
# 查看触发器
show triggers;
# 删除触发器
格式:drop trigger 触发器名字;
eg: drop trigger tri_after_insert_cmd;
最后
以上就是震动砖头为你收集整理的mysql之触发器trigger详解的全部内容,希望文章能够帮你解决mysql之触发器trigger详解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复