触发器
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表