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】玩转触发器、监听器的更多相关文章

  1. mysql 查询表,视图,触发器,函数,存储过程

    1. mysql查询所有表: SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '数据库名' AND  TAB ...

  2. MySQL的学习--触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  3. mysql存储过程和触发器的应用

    ***********[mysql 存储过程和触发器 -- 别安驹]********************* 1.什么情况下使用存储过程? 完成一些比较麻烦的逻辑,比如多表在mysql端的cpu很空 ...

  4. Mysql高级之触发器

    原文:Mysql高级之触发器 触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete). 看以下事件: 完 ...

  5. mysql查看所有触发器以及存储过程等操作集合

    今天在做每个月定时扣费的功能 用到了Mysql的Event Scheduler 昨完之后发现一个问题 Event Scheduler 默认是不开启的 要在mysql内执行SET GLOBAL even ...

  6. 【转】MySQL的学习--触发器

    MySQL包含对触发器的支持.触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行. 创建触发器 在MySQL中,创建触发器语法如下 ...

  7. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  8. 【MySQL笔记】触发器,存储过程和函数

    一.触发器 触发器(TRIGGER):是由事件来触发某个操作.当数据库系统执行这些事件时,就会激活触发器执行相应的操作.MySQL从5.0.2版本开始支持触发器. 触发事件:INSERT语句.UPDA ...

  9. mysql 查看删除触发器等操作

    mysql 查看删除触发器等操作 平时很少操作触发器,源于昨晚的一次故障,使用pt-online-change-schema修改大表过程中出现异常,再次执行时,提示已经存在触发器,导致失败. 这里推荐 ...

  10. mysql用户创建触发器权限不足跟参数log_bin_trust_function_creators

    问题描述 有业务反馈当前用户无法创建触发器和存储过程,让用户自己测试,该用户进行对表的增删改查等其他权限没有问题,这边用root用户查证,该用户拥有对当前库的所有权限,但是为什么就是创建不了触发器呢? ...

随机推荐

  1. 使用 Nuget安装DLL

    使用Nuget安装Mysql https://www.nuget.org/packages/MySql.Data 安装NewtonJson https://www.nuget.org/packages ...

  2. VS增加插件 Supercharger破解教程

    VS增加插件 Supercharger破解教程 Supercharger效果预览及下载路径: http://supercharger.tools/index.html 下载地址:https://vis ...

  3. python实现的椭圆曲线加密

    我也看得云里雾里, 但是ECC和RSA并列为非对称加密双雄, 还是很有必要了解一下的. RSA是用质数分解,ECC是用离散的椭圆方程解,安全度更高. 而且,这个ECC的加法乘法规则,和普通都不一样, ...

  4. 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 ...

  5. HDU3306 Another kind of Fibonacci 矩阵

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3306 题意概括 A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN ...

  6. Immediate Decodability HDU1305

    类似phonelist  一次ac 判断失败主要有两个要点 1. 是否包含了某段的结尾结点   说明某段被此段包含 2.此段的结尾结点是否为某段的痕迹   说明此段被包含 #include<bi ...

  7. 021 RDD的依赖关系,以及造成的stage的划分

    一:RDD的依赖关系 1.在代码中观察 val data = Array(1, 2, 3, 4, 5) val distData = sc.parallelize(data) val resultRD ...

  8. 078 Hbase中rowkey设计原则

    1.热点问题 在某一时间段,有大量的数据同时对一个region进行操作 2.原因 对rowkey的设计不合理 对rowkey的划分不合理 3.解决方式 rowkey是hbase的读写唯一标识 最大长度 ...

  9. Scrapy爬虫笔记 - 爬取知乎

    cookie是一种本地存储机制,cookie是存储在本地的 session其实就是将用户信息用户名.密码等)加密成一串字符串,返回给浏览器,以后浏览器每次请求都带着这个sessionId 状态码一般是 ...

  10. Mysql索引为什么用B+树而不用B-树

    先从数据结构的角度来看 我们知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域. 这就决定了B+树更适合用来存储外部数据,也就是所 ...