1、MySQL包含对触发器的支持。触发器是一种与表操作有关的数据库对象,

当触发器所在表上出现指定事件时,将调用该对象,

即表的操作事件触发表上的触发器的执行。


2、创建一个执行语句的触发器


create trigger 触发器名 before|after 触发事件  

on 表名  

for each row 执行语句;


before和after参数指定触发器执行的时间;


触发事件包括insert、update和delete;


for each row表示任何一条记录上的操作满足触发条件都会触发触发器;


执行语句指触发器被触发后执行的程序


create table card_info

(

  card_id int primary key ,

  uname varchar(20),

  money double

);


create table trans_info

(

   id int primary key auto_increment,

   card_id int,

   trans_type varchar(20),

   trans_money double  

);


insert into card_info values(1001,'张三',10000);

insert into card_info values(1002,'李四',20000);

insert into card_info values(1003,'王五',30000);


select * from card_info;


select * from trans_info;


insert into trans_info values(null,1001,'存款',1000);


update card_info set money=money+1000 where card_id=1001;


-- after insert 触发器   在交易记录表中添加一条交易记录 则更新我们的用户的余额

-- new 存放 触发这个触发器的 那条新增的记录

create trigger trig1

after INSERT

on trans_info

for each row  

BEGIN  

 if new.trans_type='存款' then  

    update card_info set money=money+new.trans_money where card_id=new.card_id;

 elseif new.trans_type='取款' THEN

    update card_info set money=money-new.trans_money where card_id=new.card_id;

 end if;

end;


-- 触发这个触发器

insert into trans_info values(null,1002,'取款',2000);


select * from card_info;


select * from trans_info;



-- after update  

create table card_log

(

 id int primary key auto_increment,

 before_uname varchar(20),

 after_uname varchar(20),

 update_date timestamp default now()

)


-- 更新了用户名后 将更新前后的用户名存入日志表中

-- new 存放的是更新后的记录

-- old 存放的是更新前的记录

create trigger trig2

after UPDATE

on card_info

for each ROW

BEGIN

  insert into card_log values(null,old.uname,new.uname,default);

end;


-- 触发

update card_info set uname='张小三' where card_id=1001



select * from card_info;


select * from card_log;


-- 将trans_info 中删除的记录存入日志表(自己创建)

-- old表