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

Mysql触发器

时间:2015-08-27 23:14:43      阅读:328      评论:0      收藏:0      [点我收藏+]

标签:mysql   mysql触发器   

创建触发器

delimiter $ 把mysql结束符号 变成$
CREATE TRIGGER <触发器名称>        <-----触发器名字
{ BEFORE | AFTER }                <-----触发时间
触发时间:触发器有执行的时间设置:可以设置为事件发生前或后
{ INSERT | UPDATE | DELETE }
ON <表名称>       <-----表名称
触发器是属于某一个表的:当在这个表上执行插入、更新或删除操作的时候就导致触发器的激活,我们不能给同一张表的同一个事件安排两个触发器。
FOR EACH ROW
FOR EACH ROW子句通知触发器每隔一行执行一次动作,而不是对整个表执行一次。
<触发器SQL语句>
触发器包含所要触发的SQL语句:这里的语句可以是任何合法的语句,包括复合语句,但是这里的语句受的限制和函数的一样。

创建带有触发器的表

CREATE TABLE t22 (s1 INTEGER)//

CREATE TRIGGER t22_bi
BEFORE INSERT ON t22
FOR EACH ROW
BEGIN
SET NEW.s1 = 55;
END;

创建了一个名字为t22的表,然后在表t22上创建了一个触发器t22_bi,当我们要向表中的行插入时,触发器就会被激活,执行将s1列的值改为55的动作

查看已有触发器

show triggers;

删除触发器

drop trigger <触发器名称>

old和new

在触发器的SQL语句中,你可以关联表中的任意列。但你不能仅使用列的名称去标识,那会使系统混淆,因为那里可能会有列的新名(这可能正是你要修改的,你的动作可能正是要修改列名),还有列的旧名存在。因此你必须用这样的语法来标识:

  “NEW . 列名”或者”OLD . 列名”.这样在技术上处理(NEW | OLD )新和旧的列名, 属于创建了过渡变量

insert 原本没有这一行数据但是你插入了这一条数据所以就是新
delete 原本这一行是有 但是删了之后这一行是没有的 所以就是旧
update 曾经的数据是旧 改之后的数据是新

小问题

库亏量仅有3个 但客户买了10个 避免库存量变成负数

create trigger t1
BEFORE   在触发之前
insert
on ord
for each row
begin

#在触发器中声明一个变量
declare
rnum int;

#把库存量num赋值给rnum
select num into rnum from goods where gid=new.gid;
#much 你要买的数量
if new.much>rnum
如果购买的数量大于库亏量的情况下就把当前库存量赋值给要购买的数量
    set new.much=rnum;
end if;
然后在修改 goods表  库存量减去当前的购买量
update goods set num=num-new.much where gid=new.gid;
end$

版权声明:一步一个脚印,方便自己复习,该出手时就出手,有错误,一定要指正,非常感谢,共同进步!

Mysql触发器

标签:mysql   mysql触发器   

原文地址:http://blog.csdn.net/w19981220/article/details/48034953

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