Mysql触发器

来源:互联网 发布:淘宝广告图片在线制作 编辑:程序博客网 时间:2024/04/30 09:03

创建触发器

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

创建带有触发器的表

CREATE TABLE t22 (s1 INTEGER)//CREATE TRIGGER t22_biBEFORE INSERT ON t22FOR EACH ROWBEGINSET 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 t1BEFORE   在触发之前inserton ordfor each rowbegin#在触发器中声明一个变量declarernum int;#把库存量num赋值给rnumselect 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$
0 0