mysql中触发器的简单实例

原创
2016-06-07 17:52:07 697浏览

一个简单的例子

1.1. 创建表:

create table t(s1 integer);

1.2. 触发器:

代码如下 复制代码
?delimiter |
create trigger t_trigger before insert on t for each row
begin set @x = "hello trigger";
set NEW.s1 = 55;
end;


|
1.3. 如果触发器创建错误,可能只能删除了,至少我试过不能replace

drop trigger t_trigger;

1.4. 当执行insert 时:

insert into t values(1);

1.5. 会执行触发器t_trigger

select @x,t.* from t;

1.6. 可以看到结果:

1.7可以使用 SHOW TRIGGERS; 查看新建的触发器


#创建触发器,当往order表中添加记录是,更新goods表

代码如下 复制代码
delimiter $
CREATE TRIGGER trigger1
AFTER INSERT ON `order`
FOR EACH ROW
BEGIN
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$

执行

代码如下 复制代码
INSERT INTO `order` (gid,much) VALUES(1,5)

SELECT * FROM goods WHERE id=1


发现 电视机的数量剩下30

当执行

代码如下 复制代码
INSERT INTO `order` (gid,much) VALUES(2,100)



发现
冰箱的数量剩下-77

这是一个很明显的漏洞,如何补救呢?
由于update事件是在insert之后发生的,所以我们无法事先对用户的下单数量(即order表
中的much字段)进行过滤
解决办法:
在创建触发器的时候,将after关键字改成before,并对用户的下单数量进行判断


首先,得删除先去的触发器
drop trigger trigger1;

代码如下 复制代码
#创建触发器
#触发时间:before
delimiter $
CREATE TRIGGER trigger1
BEFORE INSERT ON `order`
FOR EACH ROW
BEGIN
IF new.much >5 THEN
SET new.much=5
END IF;
UPDATE goods SET num=num-new.much WHERE id=new.gid;
END$

这样,当执行INSERT INTO `order` (gid,much) VALUES(2,100)的时候,写入order表的下单数量其实只有5,同样,goods表中的库存数量只有减少5,因为在insert操作之前先触发了
update操作,借此可以对下单数量做个判断

下面我们来做个题目

现在有张表user(id,name,pass)

还有一张表user_data(,d_id,d_name,d_tel);

我想让在user表添加一个记录的时候触发使user_data也添加一条记录.

比如记录是 1 , 张三,114

这个触发器在mysql中要怎么写,记得是mysql不是别的

代码如下 复制代码
mysql> delimiter //
-> create trigger sitedata_ins2
-> before insert on user
-> for each row
-> Begin
-> If not exists(select 1 from user_data where d_id=new.id) then
-> insert into user_data(d_id,d_name) values(new.id,new.name);
-> END IF;
-> end;//
-> delimiter ;


或者简单一点:

代码如下 复制代码
mysql> delimiter //
-> create trigger sitedata_ins2
-> before insert on user
-> for each row
-> Begin
-> insert into user_data(d_id,d_name) values(new.id,new.name);
-> end;//
-> delimiter ;

二种方法都可以,建议你用第一种

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。