【MySQL】玩转触发器、监听器
1、触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL。
创建触发器
语法如下:
CREATE TRIGGER trigger_name trigger_time trigger_event
ON tbl_name FOR EACH ROW trigger_stmt
BEGIN
SQL;
END$
触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。
触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。
trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。
trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:
· INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
· UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
· DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
.......
废话不多说,直接上代码和效果:(核心知识:只要是被insert、update或者delete的那一列,那么该列所有字段都可以使用【new.字段名】来表示)
2、insert类触发器
DROP TABLE if EXISTS account;
CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2),NUM INT ); CREATE TRIGGER ins_sum AFTER INSERT ON account FOR EACH ROW
UPDATE
employee
SET
Age = new.acct_num + 1
WHERE ID = new.acct_num ; INSERT INTO account(acct_num,amount) VALUES(1,2.00);
SELECT * FROM employee
实例二:2018/11/23日,新增 --- (避免使用事物,可以使用这种触发器【分别创建 新建触发器和更改触发器,删除是软删除,包含在更新里面 】)
DROP TRIGGER if EXISTS cmf_book_class_num_insert;
CREATE TRIGGER cmf_book_class_num_insert AFTER INSERT ON cmf_book_class_log FOR EACH ROW
BEGIN
UPDATE cmf_book_class SET total_num = (
SELECT SUM(cmf_book_class_log.num) FROM cmf_book_class_log
WHERE cmf_book_class_log.delete_time is null
AND cmf_book_class_log.class_id=new.class_id
AND cmf_book_class_log.book_id=new.book_id
) WHERE class_id=new.class_id AND book_id=new.book_id AND delete_time is NULL;
END
主表结构:
从表结构:
3、update类触发器:ims_shopping_goods_option 商品规格从表,ims_shopping_goods 商品主表。 -- 逻辑关系:主表的商品id==从表goodsid。
目的:实时监控主表商品的库存night_num值。
//建表
CREATE TABLE `ims_shopping_goods` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`is_nightpay` tinyint(1) DEFAULT '0' COMMENT '是否参加午夜订购专区',
`night_num` int(11) DEFAULT NULL COMMENT '午夜订购库存',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=438 DEFAULT CHARSET=utf8;
CREATE TABLE `ims_shopping_goods_option` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`goodsid` int(10) DEFAULT '0',
`erp_oid` int(11) NOT NULL DEFAULT '0' COMMENT 'erp2规格id',
`is_nightpay` tinyint(3) DEFAULT '0' COMMENT '是否参加午夜订购专区',
`night_num` int(11) DEFAULT '0' COMMENT '午夜订购库存',
PRIMARY KEY (`id`),
KEY `indx_goodsid` (`goodsid`),
) ENGINE=MyISAM AUTO_INCREMENT=1178 DEFAULT CHARSET=utf8;
//创建触发器
DROP TRIGGER if EXISTS ins_night_num; ## 删除触发器
CREATE TRIGGER ins_night_num AFTER UPDATE ON ims_shopping_goods_option FOR EACH ROW
BEGIN
UPDATE ims_shopping_goods SET night_num = (
SELECT SUM(ims_shopping_goods_option.night_num) FROM ims_shopping_goods_option
WHERE ims_shopping_goods_option.is_nightpay=1
AND ims_shopping_goods_option.goodsid=new.goodsid
) WHERE id=new.goodsid AND is_nightpay=1;
END
###测试触发器效果
UPDATE ims_shopping_goods_option SET night_num= 8 WHERE id=1175;
SELECT id,is_nightpay,night_num FROM ims_shopping_goods WHERE id=436;
【MySQL】玩转触发器、监听器的更多相关文章
- mysql 查询表,视图,触发器,函数,存储过程
1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND TAB ...
- MySQL的学习--触发器
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...
- mysql存储过程和触发器的应用
***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...
- Mysql高级之触发器
原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...
- mysql查看所有触发器以及存储过程等操作集合
今天在做每个月定时扣费的功能 用到了Mysql的Event Scheduler 昨完之后发现一个问题 Event Scheduler 默认是不开启的 要在mysql内执行SET GLOBAL even ...
- 【转】MySQL的学习--触发器
MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...
- mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数
mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...
- 【MySQL笔记】触发器,存储过程和函数
一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...
- mysql 查看删除触发器等操作
mysql 查看删除触发器等操作 平时很少操作触发器,源于昨晚的一次故障,使用pt-online-change-schema修改大表过程中出现异常,再次执行时,提示已经存在触发器,导致失败. 这里推荐 ...
- mysql用户创建触发器权限不足跟参数log_bin_trust_function_creators
问题描述 有业务反馈当前用户无法创建触发器和存储过程,让用户自己测试,该用户进行对表的增删改查等其他权限没有问题,这边用root用户查证,该用户拥有对当前库的所有权限,但是为什么就是创建不了触发器呢? ...
随机推荐
- 使用 Nuget安装DLL
使用Nuget安装Mysql https://www.nuget.org/packages/MySql.Data 安装NewtonJson https://www.nuget.org/packages ...
- VS增加插件 Supercharger破解教程
VS增加插件 Supercharger破解教程 Supercharger效果预览及下载路径: http://supercharger.tools/index.html 下载地址:https://vis ...
- python实现的椭圆曲线加密
我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...
- Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架
Asp.Net Core 2.0 项目实战(1) NCMVC开源下载了 Asp.Net Core 2.0 项目实战(2)NCMVC一个基于Net Core2.0搭建的角色权限管理开发框架 Asp.Ne ...
- HDU3306 Another kind of Fibonacci 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3306 题意概括 A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN ...
- Immediate Decodability HDU1305
类似phonelist 一次ac 判断失败主要有两个要点 1. 是否包含了某段的结尾结点 说明某段被此段包含 2.此段的结尾结点是否为某段的痕迹 说明此段被包含 #include<bi ...
- 021 RDD的依赖关系,以及造成的stage的划分
一:RDD的依赖关系 1.在代码中观察 val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) val resultRD ...
- 078 Hbase中rowkey设计原则
1.热点问题 在某一时间段,有大量的数据同时对一个region进行操作 2.原因 对rowkey的设计不合理 对rowkey的划分不合理 3.解决方式 rowkey是hbase的读写唯一标识 最大长度 ...
- Scrapy爬虫笔记 - 爬取知乎
cookie是一种本地存储机制,cookie是存储在本地的 session其实就是将用户信息用户名.密码等)加密成一串字符串,返回给浏览器,以后浏览器每次请求都带着这个sessionId 状态码一般是 ...
- Mysql索引为什么用B+树而不用B-树
先从数据结构的角度来看 我们知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所 ...