视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
mysql中触发器的简单实例
2020-11-09 09:54:26 责编:小采
文档

一个简单的例子

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 ;

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

下载本文
显示全文
专题