文档章节

mysql触发器

eddy_linux
 eddy_linux
发布于 2015/11/05 02:55
字数 817
阅读 11
收藏 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
粉丝 21
博文 135
码字总数 188789
作品 0
成都
程序员
私信 提问
MySQL的触发器

触发器—trigeer是数据库下用于监视数据改变的某种情况,并触发执行某种操作的一个功能,简单来说就是对某一张表符合某种条件的更改前或者后执行一段存储过程。在这里就简单的说一说在MySQL...

往事_Jim_遗
01/08
0
0
mysql-之触发器_已迁移

mysql 触发器 当发生某个事件(增删更查)时可以执行定义的sql语句 ===============总结 无情的分隔线 总结======================== 一、触发器作用 MySQL包含对触发器的支持。触发器是一种与...

鬼谷子灬
2016/06/29
14
0
记一次由mysql触发器引发的故障

上周六到公司上班,刚坐下没多久,公司业务传过消息说,用户borrow表信息无法更新。查看网站报错如下: 报错信息表示是由于mysql的函数和触发器引起的,问了下公司开发,他们表示函数功能已经...

Tyrant0532
10/29
0
0
自动生成mysql触发器代码,实现数据同步

自动生成mysql触发器代码,实现数据同步 如果公司里有上百个表要做触发器,如果手动写代码的话。很累,所以今天写了一个小程序,自动生成mysql的触发代码。 $dbname = 'test';//数据库 $tab1 ...

刘赤龙
2010/06/08
0
0
Ubuntu下安装MysqlWorkBench

1、先下载workBench https://dev.mysql.com/downloads/file/?id=455790 2、先执行命令: sudo dpkg -i mysql-workbench-community-6.2.5-1ubu1404-amd64.deb 安装 安装的时候报错: liang@li......

winter199
2017/11/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

linux中shell if 判断总结

UNIX Shell 里面比较字符写法 -eq 等于; -ne 不等于; -gt 大于; -lt 小于 ; -le 小于等于; -ge 大于等于; -z 空串; -n 非空串; = 两个字符相等; != 两个字符不等 无论什么编程语言都离不开条...

linuxprobe16
16分钟前
0
0
我是如何将博客转成PDF的

前言 只有光头才能变强 之前有读者问过我:“3y你的博客有没有电子版的呀?我想要份电子版的”。我说:“没有啊,我没有弄过电子版的,我这边有个文章导航页面,你可以去文章导航去找来看呀”...

Java3y
18分钟前
1
0
nginx的一些总结

Linux下安装Nginx完整教程及常见错误解决方案 1.Nginx安装环境 Nginx是C语言开发,建议在linux上运行,本教程使用Centos7.0作为安装环境. 1)gcc 安装nginx需要先将官网下载的源码进行编译,编译...

Yao--靠自己
25分钟前
1
0
Predicate函数式接口

Predicate接口主要用于流的筛选,比如在filter方法中传入Predicate判断。 作为函数式接口,这里居然有三个default方法,一个static方法,子孙满堂! 正统的接口方法,就是boolean test(T t)...

woshixin
26分钟前
1
0
sql 开窗函数

开窗函数:在开窗函数出现之前存在着很多用 SQL 语句很难解决的问题,很多都要通过复杂的相关子查询或者存储过程来完成。为了解决这些问题,在 2003 年 ISO SQL 标准加入了开窗函数,开窗函数...

hblt-j
36分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部