百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>数据库> mysql中触发器的简单实例
分享文章到:

mysql中触发器的简单实例

发布时间:01/15 来源: 浏览: 关键词:

 一个简单的例子

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,password)

还有一张表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 ;

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

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有5人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板