MySQL中触发器
触发器是与某个事件相关的特殊存储过程,与存储过程不同的是,存储过程需要用 call 调用而出发器不需要使用call调用调用。
也就是自己预先定义好了,当某个事件发生时,就会自动出发触发器进行相关的操作。
仅对 insert 、 update 、delete 有效,对select无。
五要素
trigger_name :触发器名字,其实这个为了便于对触发器的修改与删除而存在。
trigger_time:触发事件,在事件触发前执行还是出发后执行。
tigger_action:触发的动作。
listen_object:监听对象。
listen_action:监听的动作。
下面是一个创建触发器的模板:
create trigger trigger_name trigger_time listen_action ON listen_object
FOR EACH ROW
BEGIN
trigger_action;
ENG$
注意:由于MySQL默认的是 ; 为语句结束符,因此在这里需要修改,我修改为$:delimeter $。
添加订单时,库存减少
订单是原先没有的,如果触发器的事件要引用新添加的订单的信息,那么就要用 new.列明,进行引用数据。
create trigger order_shop AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
update shop set shop_count = shop_count-new.order_count where shop_id = new.shop_id;
END$
删除订单,库存增加
create trigger delete_order BEFORE DELETE ON `order`
FOR EACH ROW
BEGIN
update shop set shop_count = shop_count+OLD.order_count where shop_id = OLD.shop_id;
END$
注意:这里引用数据是使用 old.列明 ,原因在于引用的数据是已经存在了,所以用old
修改订单 ,修改库存
create trigger change_order AFTER UPDATE ON `order`
FOR EACH ROW
BEGIN
update shop set shop_count = shop_count+old.order_count - new.order_count where shop_id = new.shop_id;
END$
注意:这里都用到了old和new关键字,让库存加上原来的数据再减去新数据。
查看所有的触发器:
show triggers;
触发器 after 与 before 区别
after 是 先完成数据的增删改再触发
before 是 先完成触发在再增删改。 eg:限购
例如:没人仅限购五件商品,大于5的都设为5
create trigger example_before BEFORE INSERT ON `order`
FOR EACH ROW
BEGIN
IF new.order_count>5 THEN
SET NEW.order_count = 5;
END IF;
update shop set shop_count = shop_count-new.order_count where shop_id = new.shop_id;
END$
MySQL中触发器的更多相关文章
- MySQL 中触发器的应用
在一个教育系统里面,有 科目表 ,章节表(每一科目对应若干大章节),小节表(每一大章节下面有若干小节),习题表(每一小节对应若干习题), 在后台管理系统中 有这样几个功能要实现,在 科目列表页面中 ...
- 关于mysql中触发器old和new如何更好的区别我有话要说?
1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示: 2.当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说 ...
- 关于mysql中触发器old和new
1.当使用insert语句的时候,如果原表中没有数据的话,那么对于插入数据后表来说新插入的那条数据就是new,如图所示: 2.当使用delete语句的时候,删除的那一条数据相对于删除数据后表的数据来说 ...
- MYSQL中SHOW的使用整理收藏
好记性不如乱笔头吧....下面收藏整理了mysql中show 的使用技巧....有需要的博友可以看看哈 a. show tables或show tables from database_name; / ...
- Oracle使用触发器和mysql中使用触发器的比较——学习笔记
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- Oracle使用触发器和mysql中使用触发器的比较
一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志, ...
- MySQL中的存储过程、函数与触发器
一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译.能提高数据库执行速度. 2.简单复杂操作结合事物一起封装. 3.复用性高. 4.安全性高,可指定存 ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- MySQL中的while、repeat、loop循环
循环一般在存储过程和存储函数中使用频繁,这里只给出最简单的示例 while delimiter $$ create procedure test_while() begin declare sum i ...
随机推荐
- 各种Java加密算法
如基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorit ...
- 【消息队列值Beanstalk】beeanstalk初识
Beanstalk是一个高性能.轻量级的.分布式的.内存型的消息队列系统.最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟.其实Beanstalkd是典型的类Mem ...
- python try except, 异常处理
http://www.runoob.com/python/python-exceptions.html http://blog.sciencenet.cn/blog-3031432-1059523.h ...
- sql server 多行合并一行
1. 使用函数 go CREATE FUNCTION dbo.fn_Sumtype(@type varchar(50))RETURNS varchar(8000)ASBEGIN DECLARE @va ...
- C语言使用pthread多线程编程(windows系统)二
我们进行多线程编程,可以有多种选择,可以使用WindowsAPI,如果你在使用GTK,也可以使用GTK实现了的线程库,如果你想让你的程序有更多的移植性你最好是选择POSIX中的Pthread函数库,我 ...
- std::function与std::bind 函数指针
function模板类和bind模板函数,使用它们可以实现类似函数指针的功能,但却却比函数指针更加灵活,特别是函数指向类 的非静态成员函数时. std::function可以绑定到全局函数/类静态成员 ...
- IIS7Appcmd 命令详解
IIS7 Appcmd 命令详解 废话不说!虽然有配置界面管理器!但是做安装包的时候命令创建是必不可少的!最近使用NSIS制作安装包仔细研究了一下Appcmd的命令,可谓是功能齐全. 上网查了些资料, ...
- bzoj2957楼房重建
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树.每个点记录斜率,要一个单增的序列长度(从1开始). 线段树每个点记录自己区间的 ...
- iOS签名机制解析
最近遇到一个签名的问题,借机把iOS签名相关知识点研究了一下.现总结如下:(研究过程中参考了这位仁兄的博客.很全面,本文也有部分借鉴) 非对称加密 这个是签名机制的算法基础.所谓非对称加密的是相对于对 ...
- C#细说多线程(下)
本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个方面介绍多线程的开发. 其中委托的BeginInvoke方法以及回调函数最为常用.而 I/O线程可能容易 ...