触发器
触发器的基本概念
触发器是和表相关联的一个数据库对象,是一种特殊的存储过程。
触发器关键字:trigger
基本作用:通过对表进行数据的插入、更新或删除等操作来触发,用于执行某些操作的。
触发器的创建
-
创建语句格式:
create trigger 触发器名 #[触发器名] 触发时机 #触发时机:before|after 触发条件 #触发条件:insert|update|delete ON tbl_name #表名 FOR EACH ROW #对每一行 trigger_body #执行的操作
-
例子
#建立一个表来操作 create table test1( id int primary key auto_increment, age decimal(3,0) #decimal是一种浮点型,可规定小数位数 ) #创建触发器(规定岁数范围在0-100) create trigger tir_test1_insert before insert on test1 for each row begin if new.age < 0 then set new.age = 0; elseif new.age >100 then set new.age = 100; end if; end;
-
new和old
数据库提供了两个对象new和old分别记录新值和旧值:
new:当触发插入和更新事件时可用,指向的是被插入的新数据。
old: 当触发删除和更新事件时可用,指向的是原来旧的数据。
例如:update更新数据时会把新的数据覆盖之前的数据,那new对象就是保存的新数据,而old对象是保存被覆盖之前的数据。那么相对于insert而言是没有old的,相对于delete而言是没有new的。insert 插入时 new 表示插入的数据
update 更新时,new表示新的数据,old表示的是原数据
delete 删除时, old 表示的是删除的数据
查看触发器
-
例子
# 查看所有触发器 select * from triggers; #查找指定的触发器 select * from triggers where trigger_name='触发器名';
删除触发器
-
drop trigger 触发器名;
触发器的使用特例
-
使用触发器制作日志
#创建日志表(用来记录其他表的操作) create table review ( id int primary key auto_increment, username varchar(64), action_name varchar(20), actiom_time datetime )engine innodb default charset utf8; #创建触发器 create trigger test_review_insert after insert on '需要记录的表' for each row begin insert into review values(null,user(),'insert',now()); end;
触发器限制
- 触发器不能使用将数据返回的存储过程和函数,也不能使用select和call。
- 触发器中不能使用开始和结束事务。
- 触发器不能写得太复杂,否则没改变一行,所执行的任务就太多了。
- 触发器中只要有一条语句出现错误,整个触发器就不会执行。
TIPS:虽然触发器中不能使用select查询数据,不能直接通过参数返回,但是可以通过用户变量带回数据。
例如:创建触发器带回一个参数
create trigger test_review_id
after insert on test1 for each row
begin
select new.age from test1 where new.id = id into @ages;
end;
select @ids;