触发器和事务处理

摘要与总结

想要某条语句(或某些语句)在事件发生时自动执行 —> 产生了触发器

保证成批的MySQL操作要么完全执行,要么完全不执行 —> 数据库的事务处理

触发器

推荐:MySQL触发器trigger的使用

Q:为什么需要触发器

想要某条语句(或某些语句)在事件发生时自动执行。

eg:每当订购一个产品时,都从库存数量中减去订购的数量。

Q:定义下触发器,定不定义就那样吧

在某个表发生更改时自动处理。这确切地说就是触发器。

触发器是MySQL响应INSERT、DELETE、UPDATE而自动执行的一条MySQL语句。

所以,我们也可以将触发器分下类:INSERT型触发器、DELETE型触发器、UPDATE型触发器

在具体使用触发器的时候,还得补充两个表:NEW表、OLD表

  • 在INSERT型触发器中,NEW用来表示将要(BEFORE)或已经(AFTER)插入的新数据;
  • 在DELETE型触发器中,OLD用来表示将要或已经被删除的原数据;
  • 在UPDATE型触发器中,OLD用来表示将要或已经被修改的原数据,NEW用来表示将要或已经修改为的新数据;
  • OLD是只读的,而NEW则可以在触发器中使用 SET 赋值,这样不会再次触发触发器,造成循环调用
-- 触发器

-- insert触发器
create trigger insert_trigger
after insert on orders
for each row
select new.order_date into @tmp;

-- 验证insert触发器
insert into orders(order_date,cust_id) values(now(),10001);
select @tmp;

-- 查看触发器
show triggers;

-- 删除Insert触发器
drop trigger insert_trigger;

-- -----------------------------------------

-- delete 触发器
-- 准备工作创建一个表
create table order_delete_items(order_num int,order_date datetime,cust_id int);
delimiter $$
create trigger delete_trigger before delete on orders
for each row
begin
	insert into order_delete_items(order_num,order_date,cust_id)
    values(old.order_num,old.order_date,old.cust_id);
end$$
delimiter ;

-- 验证删除触发器
-- 由于主键外键的约束
show variables like 'sql_safe%';
set sql_safe_updates=0;
-- select order_num from orders where cust_id=10003;
delete from orderitems
	where order_num in(select order_num from orders where cust_id=10003); 
delete from orders where cust_id=10003;
set sql_safe_updates=1;

-- 删除触发器
drop trigger delete_trigger;

-- ---------------------------------------------
-- update触发器
create trigger update_trigger after update on orders
for each row select 'update successfully' into @tmp;

-- 测试update触发器
update orders
set order_date=now()
where order_num=20005;

select @tmp;


管理事务处理

Q:事务的来由

有些事情虽然分为几步,但是要么做,要么不做,不能做一半停下了。

这样才能保证数据库中数据的一致性。

关于事务处理需要知道的几个术语

  • 事务(transaction)指一组SQL语句;

  • 回退(rollback)指撤销指定SQL语句的过程;

  • 提交(commit)指将未存储的SQL语句结果写入数据库表;

  • 保留点( savepoint)指事务处理中设置的临时占位符( placeholder),你可以对它发布回退(与回退整个事务处理不同)。

-- 简单的写一个没啥意义的事务处理

select * from customers where cust_id=10001;

set autocommit=0;   -- 禁止默认提交
start transaction;  -- 标识事务的开始
savepoint update1;  -- 使用保留点
update customers 
set cust_name='dacao'
where cust_id='10001';

select * from customers where cust_id=10001;

rollback to update1; -- 使用保留点
commit;           -- 提交,这里提交了个毛线
set autocommit=1; -- 启用默认提交

select * from customers where cust_id=10001;


参考文章

MySQL触发器trigger的使用

『浅入深出』MySQL 中事务的实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

da1234cao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值