当前位置: 首页 > news >正文

mysql中触发器

触发器

场景:

日志系统,记录对学生表有哪些操作!

解决的问题:

1, 得到每条学生记录被修改的时机,才能发出记录日志的动作!

2, 执行某段操作,需要得到当前处理的记录的信息!

触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码。

 

记录 =button

(修改,删除,增加) =click

执行操作 =alert(‘Hello’);

以上的所有行为,都是采用 sql 完成的:

 

语法

create trigger 触发器名字 触发条件,监听的内容,触发后执行的操作

CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 

其中,触发条件,事件。是由 事件的时机,与事件的内容 组成

时机:之前before,和之后after!

内容:增加insert,删除delete,修改update

因此,一共只有六种事件:

before insert before delete before update

after insert after delete after update

 

监听的主体是由表中的记录发出的

on table_name for each row

 

执行的操作,就是一段 sql的集合!

 

create trigger test_trigger 
after insert -- 事件
on select_student for each row -- 哪个表的记录在监听
insert into student_log values (null, 'insert', now(), 'new ID') -- 执行的sql集合
;

 

  建立日志表

create table student_log (
id int primary key auto_increment,
op varchar(10),
op_time datetime,
ps varchar(255)
);

  

执行插入:

insert into select_student values (null, '欧阳锋', 'male', 22, 1234.56, 178.00);

  

 

删除触发器

drop trigger 触发器名字

 

 

在触发程序中得到当前触发的记录信息

 

有,两个!

 

new(新的),old(旧的)

 

new,和old,都表示触发程序的记录!

 

new:新的记录。old:旧的记录!

 

 

 

取决于当前操作(intser,update,delete)去使用其中某个:

 

insert,增加记录,没有旧记录,只有new关键字可以使用

 

delete,删除记录,没有新纪录,只有old可用!

 

update,更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新纪录!因此可以 new和 old

 

 

 

记录,当前学生被删除之后,记录日志,要求记录学生的id。

 

create trigger log_del_stu after delete
on select_student for each row
insert into student_log values (null, 'delete', now(), old.id) -- 执行的sql集合
;

 

  

测试,删除记录:

create trigger log_upd_stu after update
on select_student for each row
判断学生的身高是否大于175
	记录日志
;

  

此时,留意一下 触发器,与具体的语法的执行时机:

 

当:insert into table操作!

 

判断,是否有before insert 触发器!有则执行触发程序!

真正执行 insert into

判断,是否有after insert 触发器!有则执行触发程序!

 

 

更新日志:

记录更新日志,要求是,只对某部分同学完成更新日志!

只记录,身高超过175学生的更新记录!记录学生id和修改前的身高与之后的身高

需要额外的增加条件判断!

 

逻辑分支语句:

if 条件 then

语句体

else if 条件 then

语句体

….

 

else

语句体

end if;

 

sql语句的结束符问题

可以修改 最外层的语句结束符达到目的!

delimiter $$

将语句结束修改成 $$

记住用完后要再修改回来!

delimiter $$
create trigger log_upd_stu after update
on select_student for each row
begin
if old.height > 175 then
	insert into student_log values (null, 'update', now(), concat(old.id, ':', old.height, '---', new.height));
end if;
end
$$
delimiter ;

 

如果 触发程序由多条语句组成块。此时就需要使用

begin 

end 将语句块包裹!

 

 

 

注意,关于触发器:

 

1, 一个表上的一个事件只能有一个触发器,如果需要,只能将原始的去掉,新增!

 

2, 只要事件发生,触发程序就可能执行!一条语句可能触发多个触发程序!

 

例如:

 

insert into on duplicate key update

 

before insert trigger, insert 操作失败 before update trigger, update操作, after update

 

before insert trigger, insert 操作成功 after insert trigger

转载于:https://www.cnblogs.com/zixueit/p/3885436.html

相关文章:

  • Redbean:入门(三) - Exec 以及 Query 以及 ConvertToBeans
  • WebSocket简单介绍(WebSocket 实战)(3)
  • OS X 10.9 废纸篓换上10.10 图标
  • mysql mysqldump只导出表结构或只导出数据的实现方法
  • 【JavaScript】JavaScript教程之------------------JavaScript实现
  • Codeforces Round #260 (Div. 2)
  • ORACLE基本SQL语句-添加更新数据函数篇
  • Ubuntu Cloud Image in Openstack
  • ppt Fibonacii数列的第n项------动态规划DP
  • 关于@synchronized(self)的用法
  • IDEA 快捷键整理
  • Omnithreadlibary学习(1)-异步执行
  • C++ 顶层 const
  • bzoj1532 [POI2005]Kos-Dicing
  • JSTL入门
  • Android路由框架AnnoRouter:使用Java接口来定义路由跳转
  • js ES6 求数组的交集,并集,还有差集
  • js继承的实现方法
  • maya建模与骨骼动画快速实现人工鱼
  • node入门
  • php面试题 汇集2
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 测试如何在敏捷团队中工作?
  • 技术:超级实用的电脑小技巧
  • 聊聊flink的TableFactory
  • 原生js练习题---第五课
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #define 用法
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #pragma once
  • #经典论文 异质山坡的物理模型 2 有效导水率
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (day 2)JavaScript学习笔记(基础之变量、常量和注释)
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (十一)图像的罗伯特梯度锐化
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (转)【Hibernate总结系列】使用举例
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net Redis的秒杀Dome和异步执行
  • .NET 将多个程序集合并成单一程序集的 4+3 种方法
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .net和jar包windows服务部署
  • .NET连接MongoDB数据库实例教程
  • .NET中的十进制浮点类型,徐汇区网站设计
  • /*在DataTable中更新、删除数据*/
  • /使用匿名内部类来复写Handler当中的handlerMessage()方法
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析
  • [20171101]rman to destination.txt
  • [Assignment] C++1