文档章节

mysql触发器

eddy_linux
 eddy_linux
发布于 2015/11/05 02:55
字数 817
阅读 9
收藏 0
点赞 0
评论 0
/*
触发器四要素:监视谁
 监视动作
 触发时间
 触发事件
例如:商品表 goods
订单表 ord
当下一个订单的时候对应的商品表减少
监视谁:ord
监视动作:insert
触发时间:after
触发事件:update
语法:
create trigger t1
after
insert
on ord
for each row
begin
update goods xxxxxx
end;
查看trigger show triggers;
删除已有trigger drop trigger triggername
*/
create table goods(
gid int,
namegood varchar(20),
num smallint
);
create table ord(
oid int,
gid varchar(20),
much smallint
);
insert into goods values
(1,'cat',34),
(2,'dog',65),
(3,'pig',21);

以上准备好数据了
/*防止爆仓*/
delimiter $ 
create trigger t1
before
insert
on ord
for each row
begin
declare
rnum int;
select num into rnum from goods where gid=new.gid;
if new.much > rnume then
set new.much = rnum;
end if;
update goods set num = num - new.much where gid=new.gid;/*行引用变量需要传参*/
end$
 
/*修改订单*/
delimiter $ 
create trigger t2
before
update
on ord
for each row
begin
update goods set num = num + old.much - new.much where gid=old.gid;/*行引用变量需要传参*/
end$

/*取消订单*/
delimiter $
create trigger t3
after
delete
on ord
for each row
begin
update goods set num=num+old.much where gid=old.gid;/*行引用变量需要传参*/
end$
以上建立了三个触发器
t1:下一个订单之后,库存相应减少,防止订单商品数量超过库存
t2:修改订单商品数量,库存相应改变
t3:取消订单,库存变为下订单之前数量

验证:
1.下订单
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  34 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
mysql> select * from ord;
Empty set
mysql> insert into ord values(100,1,10
);
Query OK, 1 row affected
mysql> select * from ord;
+-----+-----+------+
| oid | gid | much |
+-----+-----+------+
| 100 | 1   |   10 |
+-----+-----+------+
1 row in set
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  24 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
下了一个订单库存减少相应订单商品数量 

 2.取消订单
 mysql> select * from ord;
+-----+-----+------+
| oid | gid | much |
+-----+-----+------+
| 100 | 1   |   10 |
+-----+-----+------+
1 row in set
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  24 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
mysql> delete from ord where oid=100;
Query OK, 1 row affected
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  34 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
mysql> select * from ord;
Empty set
3.修改订单
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  34 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
mysql> select * from ord;
Empty set
mysql> insert into ord values(100,1,20
);
Query OK, 1 row affected
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  14 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
mysql> update ord set much=10 where gid=100;
Query OK, 0 rows affected
Rows matched: 0  Changed: 0  Warnings: 0
mysql> update ord set much=10 where oid=100;
Query OK, 1 row affected
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  24 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set

4.防止爆仓
 mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |  29 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
mysql> insert into ord values(102,1,30);

mysql> select * from goods;
+-----+----------+-----+
| gid | namegood | num |
+-----+----------+-----+
|   1 | cat      |   0 |
|   2 | dog      |  65 |
|   3 | pig      |  21 |
+-----+----------+-----+
3 rows in set
 mysql> select * from ord;
+-----+-----+------+
| oid | gid | much |
+-----+-----+------+
| 100 | 1   |    5 |
| 102 | 1   |   29 |
+-----+-----+------+
 
 5、mysql中的for each row是干什么?
    在oracle触发器中,触发器分为语句级和行级触发器
create trigger tn
after
update
on xxtable
for each row#每一行受影响,触发器都执行,所以叫行级触发器
begin
sql语句
end
执行update table set xxx=xxx where id>100;#修改100行
sql语句会被触发100次 
 
在oracle中for each row不写,无论update语句一次影响多少行,都只执行1次

mysql不支持语句级触发器


© 著作权归作者所有

共有 人打赏支持
eddy_linux
粉丝 18
博文 135
码字总数 188789
作品 0
成都
程序员

暂无相关文章

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

Nginx + uwsgi @ubuntu

uwsgi 安装 sudo apt-get install python3-pip # 注意 ubuntu python3默认没有安装pippython3 -m pip install uwsgi 代码(test.py) def application(env, start_response): start_res......

袁祾 ⋅ 昨天 ⋅ 0

版本控制工具

CSV , SVN , GIT ,VSS

颖伙虫 ⋅ 昨天 ⋅ 0

【2018.06.19学习笔记】【linux高级知识 13.1-13.3】

13.1 设置更改root密码 13.2 连接mysql 13.3 mysql常用命令

lgsxp ⋅ 昨天 ⋅ 0

LVM

LVM: 硬盘划分分区成物理卷->物理卷组成卷组->卷组划分逻辑分区。 1.磁盘分区: fdisk /dev/sdb 划分几个主分区 输入t更改每个分区类型为8e(LVM) 使用partprobe生成分区的文件:如/dev/sd...

ZHENG-JY ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部