1.触发器在数据库里以独立的对象存储,
2.触发器不需要调用,它由一个事件来触发运行
3.触发器不能接收参数
--触发器的应用
举个例子:校内网、开心网、facebook,当你发一个日志,自动通知好友,其实就是在增加日志的时候做一个触发,再向表中写入条目。
--触发器的效率很高
举例:论坛的发帖,每插入一个帖子都希望将版面表中的最后发帖时间,帖子总数字段进行同步更新,这时使用触发器效率会很高。
触发器(trigger):监视某种情况,并触发某种操作。
触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/before) 4.触发事件(insert/update/delete)语法:
drop tigger if exits `触发器名称`;
delimiter $$
create tigger 触发器名称
after/before insert/update/delete on 表名
for each row # 这句话在MySQL中是固定的
begin
SQL语句;
[INSERT INTO case_category(id,name,create_date) values(new.id,"new",now());]
end;
$$
delimiter ;
几点说明:
delimiter:改变输入的结束符,默认情况下输入结束符是分号;,这里把它改成了两个$$,这样做的目的是把多条含分号的语句做个封装,全部输入完之后一起执行,而不是一遇到默认的分号结束符就自动执行;
new:当触发插入和更新事件时可用,指向的是被操作的记录
old: 当触发删除和更新事件时可用,指向的是被操作的记录
举例:
DROP TRIGGER IF EXISTS `tri_insert_user`; DELIMITER ;; CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user', now()); end ;; DELIMITER ;
我们如何在触发器引用行的值,也就是说我们要得到我们新插入的订单记录中的gid或much的值。
对于insert而言,新插入的行用new来表示,行中的每一列的值用new.列名来表示。
begin
update g set num=num-new.much where id=new.gid;
end
对于delete而言:原本有一行,后来被删除,想引用被删除的这一行,用old来表示,old.列名可以引用被删除的行的值。
begin
update g set num = num + old.much where id = old.gid;
end
修改的后的数据,用new来表示,new.列名引用被修改之后行中的值。
begin
update g set num = num+old.much-new.much where id = old.gid/new.gid;
end
先把旧的数量恢复再减去新的数量就是修改后的数量了。