触发器

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表

 

posted @ 2022-11-08 23:07  呆萌老师  阅读(182)  评论(0编辑  收藏  举报