欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

mysql中触发器的简单实例

程序员文章站 2022-03-24 21:15:40
...
一个简单的例子

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 ;

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

相关标签: 触发器 mysql