触发器:trigger
创建触发器的语法
mysql> delimiter $
mysql> create trigger 触发器名称
after/before(触发时间)
insert/update/delete(监视事件)
on 表名(临视地址)
for each row
begin
sql1;
...
sqlN;
end$
mysql> delimiter ;

查看已有trigger: show trigger;
删除已有trigger: drop trigger 触发器名称

1.
表结构:
商品表:goods
订单表:ord
需求:
当下1个订单时,对应的商品要相应减少(买几个商品就少几个商品)
分析:
监视谁:ord
临视动作:insert
触发时间:之后
触发事件:update
语法:
create trigger t1
after
insert
on ord
for each row
begin
update goods xxxx
end;

 create table goods(
gid int,
name varchar(20),
num int
);
create table ord(
oid int,
ggid int,
muth int
); insert into goods values
(1,'cat',34),
(1,'dog',86),
(1,'pig',12); //添加时候
create trigger t1
after
insert
on ord
for each row
begin
update goods set num=num-new.muth where gid=new.ggid;
end; //删除时候
create trigger t2
after
delete
on ord
for each row
begin
update goods set num=num+old.muth where gid=old.ggid;
end; //修改时候
create trigger t3
before
update
on ord
for each row
begin
update goods set num=num+old.muth-new.muth where gid=old.ggid;
//或写成:update goods set num=num+old.muth-new.muth where gid=new.ggid;
end; # 如果购买量muth > 库存量num时,把muth自动改为num create trigger t4
before
insert
on ord
for each row
begin
# 申明变量
declare
rnum int;
# 判断
select num into rnum from goods where gid=new.ggid;
if new.muth > rnum then
set new.muth=rnum;
end if; update goods set num=num+old.muth-new.muth where gid=old.ggid;
end;

例2:添加数据,触发别一个统计表,如存在就插入统计记录,如统计记录中有插入过就修改

 create trigger 触发器名称
before
insert
on 触发的表
for each row
begin
declare
resNum int;
select count(*) into resNum from 表名A where projectID=new.projectID and addDate=CURDATE();
if resNum=0 then
insert into 表名A (projectID,addDate,gtotal,stotal) values(new.projectID,CURDATE(),1,1);
else
update 表名A set gtotal=gtotal+1,stotal=stotal+1 where projectID=new.projectID and addDate=CURDATE();
end if;
end;

例:
插入

DELIMITER $$

USE `super`$$

DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount`$$

CREATE
TRIGGER `wu_autocount` BEFORE INSERT ON `gbook_data`
FOR EACH ROW BEGIN
DECLARE resNum INT;
DECLARE nums INT; IF new.status='' THEN
SET nums=1;
ELSE
SET nums=0;
END IF;
SELECT COUNT(*) INTO resNum FROM gbook_autocount WHERE projectID=new.projectID AND ADDDATE=CURDATE();
IF resNum=0 THEN
INSERT INTO gbook_autocount (projectID,ADDDATE,gtotal,stotal) VALUES(new.projectID,CURDATE(),1,nums);
ELSE
UPDATE gbook_autocount SET gtotal=gtotal+1,stotal=stotal+nums WHERE projectID=new.projectID AND ADDDATE=CURDATE();
END IF;
END;
$$ DELIMITER ;
删除:
DELIMITER $$ USE `super`$$ DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount_del`$$ CREATE
TRIGGER `wu_autocount_del` AFTER DELETE ON `gbook_data`
FOR EACH ROW BEGIN
DECLARE num INT;
SELECT gtotal INTO num FROM super.`gbook_autocount` WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
IF num<=1 THEN
DELETE FROM super.`gbook_autocount` WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
ELSE
IF old.status!='' THEN
UPDATE super.`gbook_autocount` SET gtotal=gtotal-1 WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
ELSE
UPDATE super.`gbook_autocount` SET gtotal=gtotal-1,stotal=stotal-1 WHERE `projectID`=old.projectID AND `addDate`=old.addDate;
END IF;
END IF;
END;
$$ DELIMITER ; 更新:
DELIMITER $$ USE `super`$$ DROP TRIGGER /*!50032 IF EXISTS */ `wu_autocount_update`$$ CREATE
TRIGGER `wu_autocount_update` BEFORE UPDATE ON `gbook_data`
FOR EACH ROW BEGIN
IF new.status!=old.status THEN
IF new.status!='' && old.status='' THEN
UPDATE gbook_autocount SET stotal=stotal-1 WHERE projectID=new.projectID AND ADDDATE=old.ADDDATE;
ELSEIF new.status='' && old.status!='' THEN
UPDATE gbook_autocount SET stotal=stotal+1 WHERE projectID=new.projectID AND ADDDATE=old.ADDDATE;
END IF;
END IF;
END;
$$ DELIMITER ;

Mysql触发器简明使用的更多相关文章

  1. MySQL触发器如何正确使用

    MySQL触发器如何正确使用 2010-05-18 15:58 佚名 博客园 字号:T | T 我们今天主要向大家介绍的是MySQL触发器进行正确使用,其中包括对MySQL触发器发器的语句创建,触发时 ...

  2. 【转】mysql触发器的实战(触发器执行失败,sql会回滚吗)

    1   引言Mysql的触发器和存储过程一样,都是嵌入到mysql的一段程序.触发器是mysql5新增的功能,目前线上凤巢系统.北斗系统以及哥伦布系统使用的数据库均是mysql5.0.45版本,很多程 ...

  3. redis作为mysql的缓存服务器(读写分离,通过mysql触发器实现数据同步)

    一.redis简介Redis是一个key-value存储系统.和Memcached类似,为了保证效率,数据都是缓存在内存中.区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录 ...

  4. mysql触发器的例子--插入前更新数据

    本文介绍下,一个mysql触发器的例子,在数据插入前更新相关内容,有需要的朋友参考下. mysql触发器的例子,如下: view source print? 001 mysql> CREATE  ...

  5. mysql触发器的作用及语法

    触发器是一种特殊的存储过程,它在插入,删除或改动特定表中的数据时触发运行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力. 数据库触发器有下面的作用: 1.安全性.能够基于数据库的值使用户具有 ...

  6. MySQL 触发器结构及三个案例demo

    --你必须拥有相当大的权限才能创建触发器(CREATE TRIGGER),如果你已经是Root用户,那么就足够了.这跟SQL的标准有所不同. CREATE TRIGGER语法 CREATE TRIGG ...

  7. 利用MySQL触发器实现check和assertion

    MySQL虽然输入check语句不会报错,但是实际上并没有check的功能.但是MySQL 依然可以利用触发器来实现相应功能. 本文将根据两个例子简要阐述MySQL实现check和assertion的 ...

  8. 猎八哥浅谈MYSQL触发器

    什么是MYSQL触发器,我们先了解一下触发的意思.触发的字面意思是指因触动而激发起某种反应. MYSQL必知必会中对触发器的解释是:MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于 B ...

  9. MYSQL触发器在PHP项目中用来做信息备份、恢复和清空

    案例:通过PHP后台代码可以将员工的信息删除,将删除的员工信息进行恢复(类似于从回收站中恢复员工信息),并且还可以将已经删除的员工进行清空(类似于清空回复站的功能). 思路:要有一张员工表,还要有一张 ...

随机推荐

  1. Sprint第二个冲刺(第三天)

    一.Sprint 计划会议:        今天我们召开了第二个Sprint的第三次会议,会议上我们把各自完成的情况进行了一次总结,现在主界面和美化按钮.增添图片的功能已经完成了,Doing里面的其他 ...

  2. CSS控制文本自动换行

    1.你定死表格的宽度,即给表格一个宽度值(是数值,不是百分比) 2.强制不换行 div{ //white-space:不换行;normal 默认;nowrap强制在同一行内显示所有文本,直到文本结束或 ...

  3. 编码规范(二)之Code Templates的设置(转)

    http://swiftlet.net/archives/1199 编码规范(二)之Code Templates的设置(转) 文件(Files)注释标签:/** * @Title: ${file_na ...

  4. Tyvj 9.10 总结 (其实只是发一下心情)

    原以为能拿200的,然而看到成绩彻底方了,60滚粗,连100都不到 这种成绩连一等都拿不到,我tm还谈什么省选,更别说NOI了 目前还没有部分分版本的,也没有数据,不知道问题出在哪里 tyvj群里好多 ...

  5. kuangbin_ShortPath E (POJ 1860)

    第一次做判环 然后RE了五次 死在了奇怪的点 memset(vis, 0, sizeof dis); memset(dis, 0, sizeof vis); 什么鬼?? 什么鬼?? 其实代码本身还是不 ...

  6. centos启动流程[转]

    启动流程概览 在硬件驱动成功后,Kernel 会主动呼叫 init 程序,而 init 会取得 run-level 资讯: init 运行 /etc/rc.d/rc.sysinit 文件来准备软件运行 ...

  7. php安全的改进以及检测文件是否被篡改

    可以使用svn的check for modifications//查看更改 至于缓存的php模板文件 可以查找以下执行命令的函数是否存在phpinfo,eval,exec,passthru,shell ...

  8. 虚拟化之vmware-vsphere概念,原理,功能

    080-login-back.vmx .encoding = "UTF-8"config.version = "8"virtualHW.version = &q ...

  9. cocos2dx 2.x mac proj 开启模板

    为一个cocos2dx 2.x游戏配了下mac工程,运行后发现clippingNode没起作用,运行TestCpp中的clippingNode示例是起作用的,对比AppController.mm,发现 ...

  10. Openjudge计算概论-计算矩阵边缘元素之和

    /*======================================================================== 计算矩阵边缘元素之和 总时间限制: 1000ms ...