码迷,mamicode.com
首页 > 数据库 > 详细

sql编程小结之触发器

时间:2016-05-01 01:10:30      阅读:226      评论:0      收藏:0      [点我收藏+]

标签:

对照mysql5.1手册,对这几天学的sql编程进行小结,主要涉及触发器、存储过程、权限管理、主从分离等,权当抛砖引玉,高手请略过。

一、触发器 通俗的说就是在指定的数据表增删改的前或后触发执行特定的sql语句,数据表为引用永久性表。不能将触发程序与TEMPORARY表或视图关联起来。可以从四个方面理解触发器:

---监视地点 table
---监视事件 insert/update/delete
---触发时间 after/before
---触发事件 insert/update/delete

创建语法:

create trigger 触发器名称
after/before
insert/update/delete
on 表名
for each row
begin
sql1;
..
sqlN;
end

首先声明结束符

delimiter $ ---默认是;号结尾,但是sql语句以分号结尾后执行触发器会报语法错误,所以要提前声明结束符为分号以外的

---创建测试需要的两张表

CREATE TABLE `goods` (

`gid` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`num` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8$

CREATE TABLE `orders` (

`oid` int(11) DEFAULT NULL,
`gid` int(11) DEFAULT NULL,
`much` smallint(6) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8$
插入测试数据

INSERT INTO goods VALUES(1,‘BMW‘,20),(2,‘mini‘,18),(3,‘ford‘,50)$

---创建触发器t2,监视订单表,当订单表增加订单时,商品表就得减少相应的商品数量;

delimiter $
create trigger t2
after
insert --不允许同一张表同一时刻有两个相同的动作 
on orders
for each row
begin
update goods set num=num-new.much where gid =new.gid;-- new.much就是新增的订单表row的值;
end$

---调用

INSERT INTO orders VALUES(123,1,2)$

再次select * from goods$查看对比前后数据

-- 创建触发器 t3,监视订单表,当订单被删掉时,商品表增加对应数量;

create trigger t3
after
delete
on orders
for each row
begin
update goods set num=num+old.much where gid =old.gid;
end$

-- 创建触发器 t5,监视订单表,在订单增加前判断是否大于库存,如果大于库存量,就让其等于库存量 区别before和after

create trigger t5
before
insert
on orders

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$

 

---删除触发器

DROP TRIGGER [schema_name.]trigger_name

舍弃触发程序。方案名称(schema_name)是可选的。如果省略了schema(方案),将从当前方案中舍弃触发程序。

一般都是直接删除触发器名的

 

sql编程小结之触发器

标签:

原文地址:http://www.cnblogs.com/weblm/p/5449461.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!