/*触发器trigger*/
触发器的概念:监视某种情况并出发某种操作例如:
一个电子商城商品表goods简称g:
主键 商品名 库存
1 电脑 28
2 手表 120
订单表o:
订单主键 订单外键 购买数量
1 2 3
2 1 5
完成下单与减少库存逻辑:
Insert into o(商品外键, 购买数量) values (2, 3);
Update g set 库存 = 库存-3 if id = 2;
这两个逻辑可以堪称一个整体,或者说insert肯定会引发update
这就可以用到触发器,我们可以监视某个表的变化,当变化发生,触发一个表的操作。
要注意:
触发器可以监视:增删改操作,没有查
触发器可以触发:增删改操作,没有查
实例:
#建立商品表
create table g(
id int,
name varchar(10),
num int
)charset utf8;
#建立订单表
create table o(
oid int;
gid int;
much int;
)charset utf8;
#添加商品表
insert into g values(1, '猪', 22), (2, ‘'羊', 10), (3, '狗', 13);
#买三只样
insert into o values(1, 2 3);
#减少商品表的库存(更新)
update g num = num -3 where id = 2;
触发器四要素:
监视地点:o表
监视操作:insert
触发操作:update
触发时间:after
因此上面的整个过程可以做成触发器(语法):
delimiter $;
create tigger tiggerName
After/Before insert/update/detele on tableName
For each row //这句是固定的为行触发器,了解oracle数据库还有表触发器
begin
insert/update/detele (sql语句); /*可以多句*/
end$
delimiter ;;
根据上面的实例一个可用的触发器:
对于insert而言,新增的行用new表示,行中每一列的值用 new.列名 来表示
delimiter $;
create tigger tg1
after insert on o
for each row
begin
update g set num = num - new.much where id = new.gid;
end$
这里增设一种情况:万一用户撤销了订单:
所以,修改订单的时候,库存也要改变
监视地点:o表
监视操作:detele
触发操作:update
触发时间:after
有了四要素,写tigger就很清楚了
对于detele而言,新增的行用old表示,行中每一列的值用 old.列名 来表示
create tigger tg2
after detele on o
for each row
befor
update g set num = num + old.much where id = old.gid;
end$
再来看修改订单的数量时,库存相应改变:
对于update而言,被修改的行修改前用old表示,行中每一列的值用 old.列名 来表示 修改之后的
行用new表示,行中每一列的值用 new.列名 来表示
create tigger tg3
after detele on o
for each row
befor
update g set num = num + old.much - new.much where id = old.gid;
end$
/*视图*/
存储查询结果的虚拟表Create view 视图名 as select语句
drop view 视图名
alter view 视图名 as select语句
(1)为什么要视图:
1.简化查询
2.可以进行权限控制
3.大数据分表的时候可用(id%表数+1、视图)
注意:
修改表视图改变
修改视图表不一定改变(因为表可能是众多行运算以后的结果,即一对多的情况,相反一对一的情况可以修改表但也要注意:对于insert视图必须包含没有默认值的列)(2)视图algorithm :
merge 就是一条语法规则,没有创建表,对视图的操作实际是和视图的语法规则合并形成一条select语句对原表的操作
temptable创建一张临时表,对视图的操作就是对临时表的操作
undefine由系统自己决定规则。
/*存储过程*/
存储过程主要为了提高效率,实现语句的批处理执行。但是in|out|inout修改变量对原表的影响这里不讨论
SHOW procedure status
drop procedure 存储过程名字
delimiter $;
create procedure name(in | out| inout)
begin
select * from tablename;
/*批语句*/
end$