实例:
#建立商品表
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 ;;
根据上面的实例一个可用的触发器:
delimiter $;
create tigger tg1
after insert on o
for each row
begin
update g set num = num - new.much where id = new.gid;
end$
这里增设一种情况:万一用户撤销了订单:
create tigger tg2
after detele on o
for each row
befor
update g set num = num + old.much where id = old.gid;
end$
再来看修改订单的数量时,库存相应改变:
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$
注意:
修改表视图改变
修改视图表不一定改变(因为表可能是众多行运算以后的结果,即一对多的情况,相反一对一的情况可以修改表但也要注意:对于insert视图必须包含没有默认值的列)undefine由系统自己决定规则。
存储过程主要为了提高效率,实现语句的批处理执行。但是in|out|inout修改变量对原表的影响这里不讨论
SHOW procedure status
drop procedure 存储过程名字
delimiter $;
create procedure name(in | out| inout)
begin
select * from tablename;
/*批语句*/
end$