Mysql高级之触发器

原文:Mysql高级之触发器

触发器是一类特殊的事务 ,可以监视某种数据操作(insert/update/delete),并触发相关操作(insert/update/delete)。

看以下事件:

完成下单与减少库存的逻辑

Insert into o (gid,num) values (2,3);  // 插入语句

Update g set goods_num = goods_num - 3 where id = 2;// 更新过程

 

这两个逻辑可以看成一个整体,或者说, insert ---> 引来 update

 

 

用触发器可以解决上述问题.

我们可以监视某表的变化,当发生某种变化时,触发某个操作.

创建触发器的语法

Create trigger triggerName 

After/before insert/update/delete  on 表名

For each row #这句话是固定的

Begin

Sql语句;  # 一句或多句,insert/update/delete范围内

End;

 

删除触发器的语法:

Drop trigger 触发器名

 

查看触发器

Show triggers

如何在触发器引用行的值

对于insert而言, 新增的行 用new 来表示,

行中的每一列的值 ,用new.列名来表示.

 

对于 delete来说, 原本有一行,后来被删除,

想引用被删除的这一行,用old,来表示,  old.列名,就可以引用被删行中的值.

 

对于update来说,

被修改的行, 

修改前的数据 ,用 old来表示, old.列名引用被修改之前行中的值

修改后的数据,用new 来表示, new.列名引用被修改之后行中的值

触发器里after 和before的区别

After 是先完成数据的增,删,改再触发,

触发的语句晚于监视的增,删,改,无法影响前面的增删改动作.

 

Before是先完成触发,再增删改,

触发的语句先于监视的增,删,改发生,我们有机会判断,修改即将发生的操作.

 

 

典型案例:

对于所下订单,进行判断,如果订单的数量 > 5 ,就认为是恶意订单,

强制把所订的商品数量改成5

查看哪些触发器:

时间: 2024-09-23 06:25:36

Mysql高级之触发器的相关文章

浅谈MySQL中的触发器

  这篇文章主要介绍了MySQL中的触发器,包括使用触发器添加.更新.删除用户等操作,需要的朋友可以参考下 在很多时候,干得利索不如想的明白.方案应该根据场景来设计,不是盲目的依靠经验,当然这也算新经验! 需求是把公司的几套公共系统做成通过邮箱用户名和密码认证,只需记住一对用户名密码,简单为上,只允许用户在ExtMail的web页面修改密码!在做论坛认证的时候,由于论坛的复杂性,想到了如下的几个方案: 通过OAuth2.0做认证,或者自己写接口,问题是只听过,没玩过! 在邮箱修改时,也提交到论坛

mysql数据库建立触发器,做历史记录查询

问题描述 mysql数据库建立触发器,做历史记录查询 大家好,我现在想做历史查询,把历史的记录保存然后做历史查询,要建立一个历史变,然后在原表上加入触发器,请问触发器语句怎么写,我是要将原表的所有字段,不管是修改还是没修改的的记录都存入历史变,因为要做历史查询,请问历史表的字段怎么设置,建立触发器,怎么写定义语句,我用的是navicat,说的具体点,新手学习,好多不懂,如果能加个qq咨询就更好了-- 解决方案 CREATE TRIGGER trigger_timee1 BEFORE UPDATE

Oracle使用触发器和mysql中使用触发器的案例比较_oracle

一.触发器 1.触发器在数据库里以独立的对象存储, 2.触发器不需要调用,它由一个事件来触发运行 3.触发器不能接收参数 --触发器的应用 举个例子:校内网.开心网.facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个出发,再向表中写入条目. --触发器的效率很高 举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高. 二.Oracle 使用 PL/SQL 编写触发器 1.--PL/SQL创建触发器的一般语法

Mysql高级之游标

原文:Mysql高级之游标 什么是游标?select 语句也许一次性会取出来n条语句,那么游标便可以一次取出来select中的一条记录.每取出来一条,便向下移动一次!可以实现很复杂逻辑! 上面还有有一个问题,会多出来一条记录,怎样搞定? 原因在于continue,而不是选择exit: 如果用continue不行吗?是可以的,没发现上面带有逻辑上有点小问题吗?这样解决:调节一下顺序 可见有n多种方法,不就是语法问题吗!

Mysql高级之存储过程

原文:Mysql高级之存储过程 概念类似于函数,就是把一段代码封装起来,当要执行这一段代码的时候,可以通过调用该存储过程来实现.在封装的语句体里面,可以用if/else, case,while等控制结构.可以进行sql编程. 在mysql中,存储过程和函数的区别, 一个是名称不同, 二个就是存储过程没有返回值. 如果想获得返回值怎么办那?通过out性变量就OK! 查看现有的存储过程: Show procedure status   删除存储过程 Drop procedure 存储过程的名字  

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

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

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

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

MySQL高级查询之与Group By集合使用介绍_Mysql

1 GROUP_CONCAT mysql> SELECT student_name,    ->     GROUP_CONCAT(test_score)    ->     FROM student    ->     GROUP BY student_name; Or: mysql> SELECT student_name,    ->     GROUP_CONCAT(DISTINCT test_score    ->               ORDER

MYSQL高级特性 -- 事务处理

下面以两个银行账户之间的转账为例子进行演示. 要使用MySQL中的事务处理,首先需要创建使用事务表类型(如BDB = Berkeley DB或InnoDB)的表. CREATE TABLE account ( account_id BIGINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, balance DOUBLE ) TYPE = InnoDB; 要在事务表上使用事务处理,必须要首先关闭自动提交: SET AUTOCOMMIT = 0; 事务处