数据库学习笔记——触发器

  • 触发器:mysql响应数据库操作语句而执行的一条Mysql语句,触发器是一种与表操作有关的数据库对象,当触发器所在表上出现指定事件时,将调用该对象,即表的操作事件触发表上的触发器的执行。

  • 创建触发器时,需要给出4条信息

    • 唯一的触发器名
    • 触发器关联的表
    • 触发器应该响应的的活动
    • 触发器核实执行
  • 使用触发器

    • insert触发器
    • delete触发器
    • update触发器
  • 删除触发器

  • 创建触发器:create trigger 触发器名 after/before 操作作语句

创建一个表,用来记录数据库操作日志
create  table order_log(id int auto_increment primary key,o_date datetime,order_num int)

new.order_num --insert触发器代码内可以引用new的虚拟表,用来访问被插入的字段order_num,如果是在before触发器中,new中还可以更改行的值
old.order_num --删除触发器代码内可以引用old的虚拟表,用来访问被删除的字段order_num

创建触发器:

delimiter //
create trigger trg_order_insert after insert on orders for each row--针对orders表中每一行,插入
begin
	insert into order_log(o_date,ordre_num) values (now(),new.order_num);--insert触发器代码内可以引用new的虚拟表,用来访问被插入的字段order_num,如果是在before触发器中,new中还可以更改行的值
end

使用触发器:

insert into orders (order_date,cust_id) values('2010-09-15',10001);
操作orders表时,会自动在order_log表中新增一条记录

修改日志表,添加一个操作类型字段

alter table order_log add dml_type varchar(10);

删除刚建立的触发器

drop trigger trg_order_inser

创建触发器,新增显示操作类型

delimiter //
create trigger trg_order_insert after insert on orders for each row--针对orders表中每一行,插入
begin
  insert into order_log(o_date,ordre_num,dml_type) values (now(),new.order_num,'insert');--insert触发器代码内可以引用new的虚拟表,用来访问被插入的字段order_num,如果是在before触发器中,new中还可以更改行的值
end

修改orders表,执行下面这行插入语句后,insert触发器会自动执行,从而order_log表中会自动插入一条数据,

insert into orders (order_date,cust_id) values ('2020-03-10',10002)
  • delete触发器
delimiter //
create trigger trg_order_delete after delete on orders for each row--针对orders表中每一行,删除操作
begin
	insert into order_log(o_date,ordre_num,dml_type) values (now(),old.order_num,'delete');--delete触发器代码内可以引用old的虚拟表,用来访问被删除的字段order_num
end

修改orders表,执行下面这行删除语句后,delete触发器会自动执行,从而order_log表中会自动插入一条数据,

delete from orders where order_num=20010
  • update触发器
delimiter //
create trigger trg_order_update after update on orders for each row--针对orders表中每一行更新操作
begin
	insert into order_log(o_date,ordre_num,dml_type) values (now(),old.order_num,'update');--update触发器代码内可以引用new和old的虚拟表,用来访问被删除的字段order_num
end
修改order表后,update触发器会自动执行,从而order_log表中会自动插入一条数据,
  • before触发器
delimiter //
create trigger trg_products_update before update on products for each row
begin
	if new.prod_price>old.prod_price*1.2 then 
		set new.prod_price=old.prod_price*1.2;
	end if;
end
如果修改products表时,修改产品的价格值大于修改前产品价格的1.2倍,那就将修改的那条数据的产品价格修改为修改前产品的价格的1.2倍数值
  • 关于触发器的进一步介绍
    • 应该用触发器保持数据的一致性(比如大小写,格式等)
    • 触发器的创建是需要权限的,但是触发器的执行是不需要权限的,当insert/delete/update语句执行时,触发器就会自动执行
    • mysql 5.1之后的版本才支持的触发器
    • 触发器可以创建审计跟踪
    • 可以同步实时地复制表中的数据
    • 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值