mysql 触发器小结

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 触发器可以监视某种数据操作(insert/update/delete)并触发(insert/update/delete)(创建触发器4要素监视地点 -----监视事件----触发时间----触发事件触发器:tri...
触发器可以监视某种数据操作(insert/update/delete)
并触发(insert/update/delete)(

创建触发器4要素
监视地点 -----监视事件----触发时间----触发事件

触发器:trigger:
需求:
我们有商品表goods,订单表 ord,当下一个订单时,对应的商品要减少

分析:
监视谁:ord表
监视动作:insert
触发事件:after
触发事件:goods表中库存减少事件,update

create trigger  t1
after
insert
on ord
for each row
begin
update goods xxxxx
end;

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,'dog',65),
(3,'pig',21);

delimiter $
create trigger  t1
after
insert
on ord
for each row
begin
update goods set num=num-2 where gid=1;
end$

查看触发器:
show triggers \G
删除已有的triggers
drop trigger t1

insert(被监测的语句)产生的数据,能否在触发器中被引用
create trigger  t2
after
insert
on ord
for each row
begin
update goods set num=num-new.much where gid=new.gid;
end$

ERROR 1235 (42000): This version of MySQL doesn't yet support 'multiple triggers with the same action time and event for one table'


#在mysql编程中的for each row 是干什么的?
在oracle 触发器中,触发器分为语句级的触发器和行级触发器

比如
create trigger tn
after update
on xxtable
for each row  #每一行受影响,触发器都指行,叫做行级触发器
begin
    sqlN
end$
指行:update xxxtable se xxx=xxx where id>100;  影响100条
那么sqlN会被触发几次?100次

在oracle 中
for each 如果不写,
无论update语句一次影响了多少行,都只执行1次

mysql不支持语句级触发器。必须写上。





查看已有的triggers:show triggers
删除已有的triggers: drop trigger triggerName

撤回一个订单时:

create trigger t3
after
delete
on ord
for each row
begin
    update goods set num=num+old.much where gid=old.gid;
end$
#改订单数量
create trigger t4
before
update
on ord
for each row
begin
    update goods set num=num+old.much-new.much where gid=old.gid;
end$

思考:before 和after的区别
如果发生爆仓情况,如何处理呢?

#在t2的基础上,完成much 与num的判断
create trigger  t5
before
insert
on ord
for each row
begin
declare 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$
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
26天前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
4月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
43 0
|
4月前
|
SQL 数据采集 关系型数据库
|
5月前
|
存储 SQL 关系型数据库
(十四)全解MySQL之各方位事无巨细的剖析存储过程与触发器!
前面的MySQL系列章节中,一直在反复讲述MySQL一些偏理论、底层的知识,很少有涉及到实用技巧的分享,而在本章中则会阐述MySQL一个特别实用的功能,即MySQL的存储过程和触发器。
|
5月前
|
存储 SQL 数据库
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
MySQL设计规约问题之为什么要避免使用存储过程、触发器和函数
|
6月前
|
存储 SQL 关系型数据库
MySQL数据库进阶第四篇(视图/存储过程/触发器)
MySQL数据库进阶第四篇(视图/存储过程/触发器)
|
6月前
|
存储 SQL 关系型数据库
MySQL周内训参照4、触发器-插入-修改-删除
MySQL周内训参照4、触发器-插入-修改-删除
47 1
|
6月前
|
存储 关系型数据库 MySQL
MySQL触发器实战:自动执行的秘密
MySQL触发器实战:自动执行的秘密
116 3
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】

热门文章

最新文章

下一篇
无影云桌面