触发器: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 ;