MySQL触发器学习总结

代码如下:

#创建触发器,当往order表中添加记录是,更新goods表
delimiter $
CREATE TRIGGER trigger1
AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$

执行
INSERT INTO `order` (gid,much) VALUES(1,5)

SELECT * FROM goods WHERE id=1

发现 电视机的数量剩下30

当执行
INSERT INTO `order` (gid,much) VALUES(2,100)

发现
冰箱的数量剩下-77

这是一个很明显的漏洞,如何补救呢?
由于update事件是在insert之后发生的,所以我们无法事先对用户的下单数量(即order表
中的much字段)进行过滤
解决办法:
在创建触发器的时候,将after关键字改成before,并对用户的下单数量进行判断

首先,得删除先去的触发器
drop trigger trigger1;


代码如下:

#创建触发器
#触发时间:before
delimiter $
CREATE TRIGGER trigger1
BEFORE INSERT ON `order`
FOR EACH ROW
BEGIN
IF new.much >5 THEN
SET new.much=5
END IF;
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$

这样,当执行INSERT INTO `order` (gid,much) VALUES(2,100)的时候,写入order表的下单数量其实只有5,同样,goods表中的库存数量只有减少5,因为在insert操作之前先触发了
update操作,借此可以对下单数量做个判断

(0)

相关推荐

  • 如何测试mysql触发器和存储过程

    1. 为了测试触发器和存储过程,首先建立一张简单的表: 复制代码 代码如下: CREATE TABLE `airuser` ( `userId` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(128) NOT NULL, PRIMARY KEY (`userId`) )ENGINE=InnoDB DEFAULT CHARSET=utf8 2. 为该表的插入操作,创建一张记录表: 复制代码 代码如下: CREATE TABLE `airus

  • MySQL 在触发器里中断记录的插入或更新?

    下面是一种实现的方法.思路就是想办法在触发器中利用一个出错的语句来中断代码的执行. mysql> create table t_control(id int primary key); Query OK, 0 rows affected (0.11 sec) mysql> insert into t_control values (1); Query OK, 1 row affected (0.05 sec) mysql> create table t_bluerosehero(id i

  • MySQL中触发器入门简单实例与介绍

    创建触发器.创建触发器语法如下: CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt 其中trigger_name标识触发器名称,用户自行指定: trigger_time标识触发时机,用before和after替换: trigger_event标识触发事件,用insert,update和delete替换: tbl_name标识建立触发器的表名,即在哪张表上建立触发

  • MySQL笔记之触发器的应用

    创建触发器 创建只有一个执行语句的触发器 复制代码 代码如下: CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件ON 表名 FOR EACH ROW 执行语句 其中,触发器名参数指要创建的触发器的名字 BEFORE和AFTER参数指定了触发执行的时间,在事件之前或是之后 FOR EACH ROW表示任何一条记录上的操作满足触发事件都会触发该触发器 复制代码 代码如下: mysql> CREATE TRIGGER trig1 AFTER INSERT    -> ON

  • 基于mysql事务、视图、存储过程、触发器的应用分析

    一 ,mysql事务 MYSQL中只有INNODB类型的数据表才能支持事务处理. 启动事务有两种方法 (1) 用begin,rollback,commit来实现 复制代码 代码如下: begin 开始一个事务rollback   事务回滚commit    事务确认 (2)直接用set来改变mysql的自动提交模式 复制代码 代码如下: set autocommit=0 禁止自动提交set autocommit=1 开启自动提交 demo 复制代码 代码如下: header("Content-t

  • MySQL 5.0触发器参考教程第1/4页

    Conventions and Styles约定和编程风格 每次我想要演示实际代码时,我会对mysql客户端的屏幕就出现的代码进行调整,将字体改成Courier,使他们看起来与普通文本不一样(让大家区别程序代码和正文).在这里举个例子: mysql> DROP FUNCTION f; Query OK, 0 rows affected (0.00 sec) 如果实例比较大,则需要在某些行和段落间加注释,同时我会用将"<--"符号放在页面的右边以表示强调.例如: mysql&

  • Mysql中的触发器简单介绍及使用案例

    什么是触发器? 触发器是数据库的一个程序,他是用来监听着数据表的某个行为,一旦数据表的这个行为发生了,马上执行相应的sql语句 触发器的语法结构: create trigger 触发器的名称触发器事件 on 监听的表名 for each row 行为发生后执行的sql语句 触发器事件组成::两部分组成: 触发器事件发生的时间-----是在监听的表的行为 after before 常用的是after 触发器执行的内容:增删改 创建order 表的时候,需要注意,因为order在mysql中是一个关

  • MYSQL设置触发器权限问题的解决方法

    本文实例讲述了MYSQL设置触发器权限的方法,针对权限错误的情况非常实用.具体分析如下: mysql导入数据提示没有SUPER Privilege权限处理,如下所示: ERROR 1419 (HY000): You do not have the SUPER Privilege and Binary Logging is Enabled 导入function . trigger 到 MySQL database,报错: You do not have the SUPER privilege an

  • mysql 触发器实现两个表的数据同步

    mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

  • MySQL与SQL的触发器的不同写法

    <触发器作用> 当在SQL.MySQL数据库中一张表中插入一条记录时,触动触发器,使同一数据库的另一张表插入相同记录. 在学习的过程中,发现两者的写法是不同的. <触发器作用> 1.在SQL中建立两张表sql_test,sql_tem.(两张表的字段是一样的) 复制代码 代码如下: create table sql_test ( id int, name varchar(16) ) create table sql_tem ( id int, name varchar(16) )

  • 用mysql触发器自动更新memcache的实现代码

    mysql 5.1支持触发器以及自定义函数接口(UDF)的特性,如果配合libmemcache以及Memcached Functions for MySQL,就能够实现memcache的自动更新.简单记录一下安装测试步骤. 安装步骤 安装memcached,这个步骤很简单,随处可见 安装mysql server 5.1RC,安装办法也很大众,不废话了 编译libmemcached,解压后安装即可./configure; make; make install 编译Memcached Functio

  • mysql触发器(Trigger)简明总结和使用实例

    一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了.你放炮仗,点燃了,一会就炸了.2,官方定义触发器(trigger)是个特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行.触发器经常用于加强数据的完整性约束和业务规则等. 触发器可以从 DBA_TRIGGERS ,USER_TRIGGERS 数

随机推荐