mysql教程-触发器

  触发器

  1. mysql触发器 情景说明

  情景设置,如图,当我们点击了购买,将会发生什么?

  

  现有如下两张表

  商品表

  编号(id)名称(name)价格(price)库存(stock)

  1F2战斗机10000100

  2法拉利80070

  3航空母舰500020

  4三栖交通工具100050

  订单表

  编号(id)商品编号(tid)购买数量(num)下单时间(order_time)

  我们现在要买5架F2战斗机,下一个订单,需要做什么?

  传统的做法:

  insert into ord(tid,num) values(1,5);

  update traffic set stock = stock - 5 where id = 1;

  新的方式:

  我们可以使用触发器,一触即发!!

  2.mysql触发器使用:trigger

  

  2.1 触发器四要素:

  地点:(表,table),

  监视的事件:(insert,delete,update)

  时间:(before/after)

  触发的事件:(insert,delete,update)

  2.2创建触发器的语法:

  

  注意:在写触发器之前,要更改的mysql的分隔符。

  监视事件和触发事件之间如何传递值?

  需求:现在我们要购买 10辆法拉利, 商品表里的触发器应该 这样写:

  #商品表的触发器

  delimiter $

  create triggter tg1

  after //事件触发在 下订单之后

  insert // 监视插入事件

  on order // 监视 order订单表

  for each row

  begin

  update traffic set stock=stock- new,num where id= new id;

  end $

  在order表的操作:

  insert into(tid,num) values(2,10);

  以下分析均对于 order表而言

  对于insert而言,

  

  新旧关系

  New表示是新插入的一行,

  要引用其中的tid和num,如何引用?

  New.tid

  new.num

  对于delete而言:

  

  对于update而言

  

  需求:先购买了10个辆法拉利,然后要把数量更改为5,写出触发器;

  #商品表的触发器

  mysql> delimiter $

  mysql> create trigger tg3

  -> after

  -> update

  -> on ord

  -> for each row

  -> begin

  -> update traffic set stock = stock + old.num - new.num where id = new.tid;

  -> end $

  [关于before]

  有没有before的情况。

  After:在监视事件发生之后触发的,触发事件要晚于监视事件。

  Before:在监视事件发生之前触发的,触发事件要早于监视事件。

  需求:若订单数量超过10的话,就认为是恶意订单,只让其购买10个。

  #商品表的触发器

  mysql> delimiter $

  mysql> create trigger tg4

  -> before

  -> insert

  -> on ord

  -> for each row

  -> begin

  -> if new.num > 10 then

  -> set new.num = 10;

  -> end if;

  -> update traffic set stock = stock - new.num where id = new.tid;

  -> end $

  3.触发器应用场合

  1.当向一张表中添加或删除记录时,需要在相关表中进行同步操作。

  比如,当一个订单产生时,订单所购的商品的库存量相应减少。

  2.当表上某列数据的值与其他表中的数据有联系时。

  比如,当某客户进行欠款消费,可以在生成订单时通过设计触发器判断该客户的累计欠款是否超出了最大限度。

  3.当需要对某张表进行跟踪时。

  比如,当有新订单产生时,需要及时通知相关人员进行处理,此时可以在订单表上设计添加触发器加以实现

时间: 2024-10-24 18:11:18

mysql教程-触发器的相关文章

MySQL中触发器的基础学习教程_Mysql

0.触发器的基本概念触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有以下的作用: (1).安全性.可以基于数据库的值使用户具有操作数据库的某种权利.   # 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据.   # 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%. (2).审计.可以跟踪用户对数据库的操作.     # 审计用户操作数据库的语句.

MySQL的触发器写法

mysql教程的触发器写法*/ trigger_name:触发器的名字,我常用的命名规则t_name_tablename_(b|a)(i|u|d),t:触发器标识,name:英文名,tablename:表名,b(before):标识是触发事件之前,a(after):标识触发事件之后,i(insert):标识insert事件,u(update):标识update事件,d(delete):标识delete事件; trigger_time:触发时间(before或after) trigger_even

mysql教程删除数据sql语句用法

  mysql教程删除数据sql语句用法 DELETE FROM 语句用于从数据库表中删除记录. 语法 DELETE FROM table_name WHERE column_name = some_value 注释:SQL 对大小写不敏感.DELETE FROM 与 delete from 等效. 为了让 PHP 执行上面的语句,我们必须使用 mysql_query( 函数.该函数用于向 SQL 连接发送查询和命令. 例子 稍早时,我们在本教程中创建了一个名为 "Person" 的表

mysql之触发器trigger的使用例子

为什么要使用触发器   触发器的优点   1,触发器的"自动性" 对程序员来说,触发器是看不到的,但是他的确做事情了,如果不用触发器的话,你更新了user表的name字段时,你还要写代码去更新其他表里面的冗余字段,我举例子,只是一张表,如果是几张表都有冗余字段呢,你的代码是不是要写很多呢,看上去是不是很不爽呢. 2,触发器的数据完整性 触发器有回滚性,举个例子,我发现我很喜欢举子,就是你要更新五张表的数据,不会出现更新了二个张表,而另外三张表没有更新. 但是如果是用php代码去写的话,

mysql的触发器,语法报错。求高手帮忙看下

问题描述 mysql的触发器,语法报错.求高手帮忙看下 这个触发器实现当在SC表中插入一条选课成绩,自动触发Upd_Credits,完成在Credits表中修改该同学的合计学分和不合格课程数.Courses表中储存有Credit信息 初学mySQl,对语法还不是很熟悉,为什么会在@Credit下面画线?其他地方有问题么

mysql-关于Mysql设置触发器以后不能插入的问题

问题描述 关于Mysql设置触发器以后不能插入的问题 我在Mysql中设置了一个触发器,在用户还没有修改用户名的情况下将uid作为默认的用户名: enter code here ///触发器没法自己修改自己的表... DELIMITER | CREATE TRIGGER default_name AFTER INSERT ON user FOR EACH ROW BEGIN update user set NEW.user_name= NEW.uid; END | 然后插入了一条数据,发现出现了

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表的操作,同时B表的触发器也会触发A表操作.在只能用mysql处理的情况下,有什么好的办法避免死循环.

mysql创建触发器报错,请高手帮忙看下

问题描述 mysql创建触发器报错,请高手帮忙看下 DROP TABLE if EXISTS tb; CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),date DATETIME,val INT); CREATE TRIGGER tri_NewBH BEFORE INSERT ON tb FOR EACH ROW BEGIN DECLARE dt CHAR(8) DECLARE bh_id CHAR(16) DECLARE number INT(1)