博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Mysql快速学习三 -----触发器
阅读量:6296 次
发布时间:2019-06-22

本文共 1705 字,大约阅读时间需要 5 分钟。

1.什么是触发器?

  监视一个表动作,在发生动作时,触发事件。

  简单理解就是但一个表发生Insert/update/delete 等操作的之前或者之后,执行预先编写好的Sql语句。

2.触发器四个要素是什么?

  监视谁(table)                监视条件(insert/update/delete)

  触发时间(before /after) 触发事件(inser/update/delete)

3.实列

    创建一个store的数据库,并创建ord(订单表)和goods(商品表)两张表并填写数据。

    

create database store;use store;create table goods(gid int,name varchar(20),num smallint);create table ord(oid int, gid int,much smallint);insert into  goods values (1,'cat',34),(2,'pig',65),(3,'dog',23);select * from ord;select * from goods;
View Code

  如果下订单,购买了12只猫,

  如果没有触发器,其操作分两步:

  

insert into ord value(123,1,12);update goods set num = num-12 where gid = 1;

  如果定义触发器如下:

DELIMITER $$;create trigger t2 after insert on ordfor each row begin    update goods set num = num-new.much where gid = new.gid;end$;

当ord表insert一条语句时,goods表相应的商品会自动减少相应的数量。

4.before和after的区别?

# 如果剩余 1只猫,订单却有10只,发生什么情况,能否预防。

#能否在购买量much>库存量时,把much自动改为num,
#提示:before

drop trigger t2; DELIMITER $$;create trigger t3before insert on ordfor each row begindeclare rnum int;    select num into rnum  from goods where gid = new.gid;    if new.much > rnum then         set new.much = rnum;    end if;    update goods set num = num-new.much where gid = new.gid;end;

 

  1)对于监视同一个表的同一个动作只能有同一个触发器。

  2)delimiter $$:对于Mysql 的每条sql语句,都是以“;”结尾,每次执行都是以“;”作为指令结束.

    在存储过程或者触发器中“;”往往不代表指令结束,DELIMITER原本就是“;”的意思,因此用这个命令转换一下“;”为“$$”,只有收到“$$”才认为指令结束可以执行。

      3)new代表需要插入的那条新数据,old代表需要删除的那条旧数据.

      4) afer是在监视动作完成后,执行触发动作,

   before 是监视动作还未完成,执行了触发动作在执行触发动作。

5.for each row 的作用?

  #每一行受影响,触发器都执行,叫做行级触发器

       1)orcle数据库支持表级锁和行级锁

    #如果订单包含了5件商品,insert 5次,可以用行级触发器5次修改库存。

    不写fore ach row,无论影响多少行都只执行一次。

  2)mysql只支持行级锁,目前mysql不支持,所以for each row 必须写。 

转载于:https://www.cnblogs.com/hellcats/p/9685406.html

你可能感兴趣的文章
10年重新出发
查看>>
2019年-年终总结
查看>>
聊聊elasticsearch的RoutingService
查看>>
让人抓头的Java并发(一) 轻松认识多线程
查看>>
从源码剖析useState的执行过程
查看>>
地包天如何矫正?
查看>>
中间件
查看>>
Android SharedPreferences
查看>>
css面试题
查看>>
Vue组建通信
查看>>
用CSS画一个带阴影的三角形
查看>>
前端Vue:函数式组件
查看>>
程鑫峰:1.26特朗.普力挺美元力挽狂澜,伦敦金行情分析
查看>>
safari下video标签无法播放视频的问题
查看>>
01 iOS中UISearchBar 如何更改背景颜色,如何去掉两条黑线
查看>>
对象的继承及对象相关内容探究
查看>>
Spring: IOC容器的实现
查看>>
Serverless五大优势,成本和规模不是最重要的,这点才是
查看>>
Nginx 极简入门教程!
查看>>
iOS BLE 开发小记[4] 如何实现 CoreBluetooth 后台运行模式
查看>>